From d9d8333f4709e683dd1e97088f38df72ea57cc36 Mon Sep 17 00:00:00 2001 From: Colcamex Resources Inc Date: Fri, 25 Feb 2022 15:13:34 -0800 Subject: [PATCH 1/5] add skip building deprecated e2e code --- pom.xml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index a178b137df..ab90f0a0a6 100644 --- a/pom.xml +++ b/pom.xml @@ -190,12 +190,6 @@ 4.0.1 provided - - - - - - org.apache.jcs jcs @@ -1688,15 +1682,16 @@ false -Xms512m -Xmx512m -Xss256k -XX:MaxNewSize=64m -XX:MaxPermSize=192m - - **/AR2005*.java - **/OntarioMDSpec4DataTest.java - **/ONAREnhancedBornConnectorTest.java - - - ${oscar.dbinit.skip} - ${project.build.directory} - + + **/AR2005*.java + **/OntarioMDSpec4DataTest.java + **/ONAREnhancedBornConnectorTest.java + org/oscarehr/e2e/**/*.java + + + ${oscar.dbinit.skip} + ${project.build.directory} + 2.10 From d719ff44aaba170bfd4e75951d3246e5f8585483 Mon Sep 17 00:00:00 2001 From: Colcamex Resources Inc Date: Sun, 6 Mar 2022 12:36:26 -0800 Subject: [PATCH 2/5] remove unused and problematic E2E / Marc Everest code --- .../cds/cds_hrm/1.1.2/cds_hrm-1.1.2.jar | Bin 0 -> 650746 bytes .../cds/cds_hrm/1.1.2/cds_hrm-1.1.2.pom | 9 + pom.xml | 36 +- .../common/service/E2ESchedulerJob.java | 216 ------- .../org/oscarehr/e2e/constant/Mappings.java | 28 +- .../org/oscarehr/e2e/director/E2ECreator.java | 53 -- .../org/oscarehr/e2e/director/E2EParser.java | 36 -- .../ObservationWithConfidentialityCode.java | 53 -- .../org/oscarehr/e2e/model/PatientExport.java | 573 ------------------ .../e2e/model/export/body/AlertsModel.java | 145 ----- .../e2e/model/export/body/AllergiesModel.java | 265 -------- .../ClinicallyMeasuredObservationsModel.java | 265 -------- .../model/export/body/EncountersModel.java | 164 ----- .../model/export/body/FamilyHistoryModel.java | 246 -------- .../model/export/body/ImmunizationsModel.java | 262 -------- .../e2e/model/export/body/LabsModel.java | 150 ----- .../model/export/body/MedicationsModel.java | 180 ------ .../e2e/model/export/body/ProblemsModel.java | 179 ------ .../model/export/body/RiskFactorsModel.java | 177 ------ .../e2e/model/export/header/AuthorModel.java | 155 ----- .../model/export/header/CustodianModel.java | 88 --- .../export/header/RecordTargetModel.java | 225 ------- .../template/AuthorParticipationModel.java | 91 --- .../export/template/ConsumableModel.java | 157 ----- .../MedicationPrescriptionEventModel.java | 136 ----- .../template/ProviderParticipationModel.java | 61 -- .../export/template/ResultComponentModel.java | 302 --------- .../export/template/ResultOrganizerModel.java | 111 ---- .../observation/AbstractObservationModel.java | 46 -- .../observation/CommentObservationModel.java | 62 -- .../observation/DateObservationModel.java | 52 -- .../observation/DoseObservationModel.java | 181 ------ .../InstructionObservationModel.java | 77 --- .../LifestageObservationModel.java | 56 -- .../OrderIndicatorObservationModel.java | 51 -- .../observation/ReactionObservationModel.java | 77 --- .../observation/ReasonObservationModel.java | 81 --- .../SecondaryCodeICD9ObservationModel.java | 62 -- .../observation/SeverityObservationModel.java | 59 -- .../observation/UnboundObservationModel.java | 56 -- .../e2e/populator/AbstractPopulator.java | 58 -- .../e2e/populator/EmrExportPopulator.java | 51 -- .../populator/body/AbstractBodyPopulator.java | 105 ---- .../body/AdvanceDirectivesPopulator.java | 70 --- .../e2e/populator/body/AlertsPopulator.java | 108 ---- .../populator/body/AllergiesPopulator.java | 114 ---- ...inicallyMeasuredObservationsPopulator.java | 97 --- .../populator/body/DocumentBodyPopulator.java | 72 --- .../populator/body/EncountersPopulator.java | 116 ---- .../body/FamilyHistoryPopulator.java | 123 ---- .../body/ImmunizationsPopulator.java | 127 ---- .../e2e/populator/body/LabsPopulator.java | 106 ---- .../populator/body/MedicationsPopulator.java | 147 ----- .../body/OrdersAndRequestsPopulator.java | 83 --- .../e2e/populator/body/ProblemsPopulator.java | 123 ---- .../populator/body/RiskFactorsPopulator.java | 108 ---- .../e2e/populator/header/AuthorPopulator.java | 85 --- .../populator/header/CustodianPopulator.java | 57 -- .../e2e/populator/header/HeaderPopulator.java | 94 --- .../header/InformationRecipientPopulator.java | 51 -- .../header/RecordTargetPopulator.java | 65 -- .../e2e/util/E2EEverestValidator.java | 57 -- .../oscarehr/e2e/util/E2EXSDValidator.java | 112 ---- .../org/oscarehr/e2e/util/EverestUtils.java | 415 ------------- .../integration/nclass/ReferencedType.java | 30 - .../integration/nclass/Storyboard.java | 31 - .../integration/nclass/Storyboards.java | 30 - .../PersonComprehensivePlacer.java | 56 -- .../PersonRegistryQueryPlacer.java | 60 -- .../clientRegistry/impl/BaseFulfiller.java | 32 - .../clientRegistry/impl/BasePlacer.java | 31 - .../nclass/clientRegistry/impl/Endpoint.java | 56 -- .../impl/GenericPlaceholder.java | 145 ----- ...aceholderPersonComprehensiveFulfiller.java | 81 --- .../PlaceholderPersonComprehensivePlacer.java | 259 -------- ...aceholderPersonRegistryQueryFulfiller.java | 276 --------- .../PlaceholderPersonRegistryQueryPlacer.java | 194 ------ .../nclass/clientRegistry/impl/Utils.java | 80 --- .../impl/exception/OutputException.java | 30 - .../clientRegistry/model/Candidate.java | 72 --- .../clientRegistry/model/Identifier.java | 53 -- .../model/PersonDemographics.java | 76 --- .../pageUtil/DemographicExportAction4.java | 204 ++++--- src/main/resources/applicationContextE2E.xml | 46 -- .../oscarehr/e2e/constant/ConstantsTest.java | 49 -- .../oscarehr/e2e/director/E2ECreatorTest.java | 47 -- .../oscarehr/e2e/director/E2EParserTest.java | 40 -- .../oscarehr/e2e/model/PatientExportTest.java | 44 -- .../model/export/AbstractExportModelTest.java | 39 -- .../model/export/body/AlertsModelTest.java | 178 ------ .../model/export/body/AllergiesModelTest.java | 423 ------------- ...inicallyMeasuredObservationsModelTest.java | 326 ---------- .../export/body/EncountersModelTest.java | 211 ------- .../export/body/FamilyHistoryModelTest.java | 340 ----------- .../export/body/ImmunizationsModelTest.java | 341 ----------- .../e2e/model/export/body/LabsModelTest.java | 167 ----- .../export/body/MedicationsModelTest.java | 216 ------- .../model/export/body/ProblemsModelTest.java | 215 ------- .../export/body/RiskFactorsModelTest.java | 252 -------- .../model/export/header/AuthorModelTest.java | 239 -------- .../export/header/CustodianModelTest.java | 109 ---- .../export/header/RecordTargetModelTest.java | 277 --------- .../AuthorParticipationModelTest.java | 118 ---- .../export/template/ConsumableModelTest.java | 268 -------- .../MedicationPrescriptionEventModelTest.java | 193 ------ .../ProviderParticipationModelTest.java | 92 --- .../template/ResultComponentModelTest.java | 529 ---------------- .../template/ResultOrganizerModelTest.java | 115 ---- .../CommentObservationModelTest.java | 149 ----- .../observation/DateObservationModelTest.java | 71 --- .../observation/DoseObservationModelTest.java | 226 ------- .../InstructionObservationModelTest.java | 105 ---- .../LifestageObservationModelTest.java | 79 --- .../OrderIndicatorObservationModelTest.java | 68 --- .../ReactionObservationModelTest.java | 125 ---- .../ReasonObservationModelTest.java | 168 ----- ...SecondaryCodeICD9ObservationModelTest.java | 81 --- .../SeverityObservationModelTest.java | 83 --- .../UnboundObservationModelTest.java | 77 --- .../e2e/populator/AbstractPopulatorTest.java | 47 -- .../oscarehr/e2e/populator/PopulatorTest.java | 74 --- .../body/AbstractBodyPopulatorTest.java | 110 ---- .../body/AdvanceDirectivesPopulatorTest.java | 45 -- .../populator/body/AlertsPopulatorTest.java | 74 --- .../body/AllergiesPopulatorTest.java | 74 --- ...allyMeasuredObservationsPopulatorTest.java | 83 --- .../body/EncounterPopulatorTest.java | 69 --- .../body/FamilyHistoryPopulatorTest.java | 75 --- .../body/ImmunizationsPopulatorTest.java | 72 --- .../e2e/populator/body/LabsPopulatorTest.java | 69 --- .../body/MedicationsPopulatorTest.java | 71 --- .../body/OrdersAndRequestsPopulatorTest.java | 45 -- .../populator/body/ProblemsPopulatorTest.java | 70 --- .../body/RiskFactorsPopulatorTest.java | 73 --- .../populator/header/AuthorPopulatorTest.java | 79 --- .../header/CustodianPopulatorTest.java | 54 -- .../populator/header/HeaderPopulatorTest.java | 123 ---- .../InformationRecipientPopulatorTest.java | 50 -- .../header/RecordTargetPopulatorTest.java | 60 -- .../e2e/util/E2EEverestValidatorTest.java | 60 -- .../e2e/util/E2EXSDValidatorTest.java | 70 --- .../oscarehr/e2e/util/EverestUtilsTest.java | 96 --- .../PersonComprehensiveQueryPlacerTest.java | 49 -- .../PersonRegistryQueryPlacerTest.java | 69 --- 144 files changed, 127 insertions(+), 17303 deletions(-) create mode 100644 local_repo/cds/cds_hrm/1.1.2/cds_hrm-1.1.2.jar create mode 100644 local_repo/cds/cds_hrm/1.1.2/cds_hrm-1.1.2.pom delete mode 100644 src/main/java/org/oscarehr/common/service/E2ESchedulerJob.java delete mode 100644 src/main/java/org/oscarehr/e2e/director/E2ECreator.java delete mode 100644 src/main/java/org/oscarehr/e2e/director/E2EParser.java delete mode 100644 src/main/java/org/oscarehr/e2e/extension/ObservationWithConfidentialityCode.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/PatientExport.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/AlertsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/AllergiesModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/EncountersModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/ImmunizationsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/LabsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/ProblemsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/RiskFactorsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/header/AuthorModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/header/CustodianModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/header/RecordTargetModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/ConsumableModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/ResultComponentModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/AbstractObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/AbstractPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/EmrExportPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/AlertsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/AllergiesPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/DocumentBodyPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/EncountersPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/LabsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/MedicationsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/ProblemsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/header/AuthorPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/header/CustodianPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/header/HeaderPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/populator/header/RecordTargetPopulator.java delete mode 100644 src/main/java/org/oscarehr/e2e/util/E2EEverestValidator.java delete mode 100644 src/main/java/org/oscarehr/e2e/util/E2EXSDValidator.java delete mode 100644 src/main/java/org/oscarehr/e2e/util/EverestUtils.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/ReferencedType.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/Storyboard.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/Storyboards.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensivePlacer.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacer.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BaseFulfiller.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BasePlacer.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Endpoint.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/GenericPlaceholder.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensiveFulfiller.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensivePlacer.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryFulfiller.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryPlacer.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Utils.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/exception/OutputException.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Candidate.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Identifier.java delete mode 100644 src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/PersonDemographics.java delete mode 100644 src/main/resources/applicationContextE2E.xml delete mode 100644 src/test/java/org/oscarehr/e2e/constant/ConstantsTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/director/E2ECreatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/director/E2EParserTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/PatientExportTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/AbstractExportModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/AlertsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/AllergiesModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/EncountersModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/ImmunizationsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/LabsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/MedicationsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/ProblemsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/body/RiskFactorsModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/header/AuthorModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/header/CustodianModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/header/RecordTargetModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/ConsumableModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/ResultComponentModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModelTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/AbstractPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/PopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/AlertsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/AllergiesPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/EncounterPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/LabsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/MedicationsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/ProblemsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/header/AuthorPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/header/CustodianPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/header/HeaderPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/populator/header/RecordTargetPopulatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/util/E2EEverestValidatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/util/E2EXSDValidatorTest.java delete mode 100644 src/test/java/org/oscarehr/e2e/util/EverestUtilsTest.java delete mode 100644 src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensiveQueryPlacerTest.java delete mode 100644 src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacerTest.java diff --git a/local_repo/cds/cds_hrm/1.1.2/cds_hrm-1.1.2.jar b/local_repo/cds/cds_hrm/1.1.2/cds_hrm-1.1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..98cecb06ec5eb00a5dfb9b761c8b8ae5f311272e GIT binary patch literal 650746 zcma&NV|bqJ)~?;yjcwa@(%80b+f5qVwr!`eZQFJl<4d23^*(dWx9iKlY}FV((TW`Q?B7L3{!JVqoYX=qPG$Mf*PT3*nl%VQL~V$9bf)tYL^Fg(`0VhJx2upV}=>Zc0l0=yw#oPPUw2;H?_golO+t{4|o4UXrmjB-l>28pmqoLI});@3S)u*U%o(n zhU0&a1kQhpgs`50qm8}WKjJa2qMR5#^r3eO3>Mgxj1Q2%N&M?f zsh++P2{@0{rsfVyF>^HT&LfMR(1(pcR%P>rE(l< zvQfrf!2M!OrN4_1lz&tAAG{L$9uEFi9hhC^b|Hx7?*ys_Dud2tP~EK?*NyVS3VtUV zaT`MvJTUc#WI?s1`7=IX&bx$U8O1cBkR@7Q_CSObOIw?WA!0YM3FrwXli%#Gb0Uj2 z4u{tVaApP?VEN} zDurH6zFRr+<%Lmw73TRk#?85pM_^Lql*Q|<0IhIP8^akQ&vs*F%tm7kSG(gLs)hoDyEHqnXY_3?QHh8sxpZmv1&3k|dE3s4fw z2yUqk6p=26)dh+Yvb;C=A|uF!438QE7lVXnb=qo9BvETtS{NMvg`V)RqSlTgdy<1& z8Dz|8R2ZKKcl0UBytp*stCAY40K5Clp4YeXxFkPwqme)ojl@!Lv}>?hk(&@KieY#B z_`2|1ZM-?%24ohg>Yw_B<C2EZ;ttgF5ByhN#M$~VgW#ZSkIUM(`U+?vjeMpKqvndk8{d%hspvB*XuZ*!72 zwr=B;*7C|lbsWJ%vg0%ELUl6Ky^l*Qv#M76kZ6}Zx=wVf)hs1H9VhlYO3&jVJRn6l zS#Jt*wd+~Lylcyg5i<3{?5FU6Pk|v;U1@d#{He4dMU#Jml(55^kGoBoPGq~8tCylM z^~RVoAgGP`D~y)75~PIm=UEIpQYC~G5XRW17V3)h&}hf#x1bm}8MzJb46nsqVX$+Y z&9BpThn-64V;1EVj5e-ubIISLB=k=#a#qYOJv4e;Q_CB1pqwI7=w~6UHXr~F+*nq6 z!T4W(Td|!Tx>_!x;563-xOE0H61b|Tp2vvYG#;(Z#V9|)?pr~bE^6H)=(awZD~Dv) z7Qq-ssq%QIkv@0S(P~%!BES2BizUUdU!}<**JP+gE~inod{Ej}WvIqUb6RRGHw51{ z!Vc^%B9SfXC{?|Y`|u)*n?ny7jok}lJ!qD+EVj1i3^}_tp_{nMzP5AkjO_x(V|{pf z>T=rb(L8w$h-3Q#$8Rlgrv#9$N|gScxHT#l?5ybuxyQ!!C->ozmk;PRBUb$ljMs+6 zp{;BGrS1I|>ht8*a}UHE#T{>m_A`qwCw8vD*El-f8F1Yl+}~9*1ats%^QmWppns|w z{Qpul!Z!9+dXA1phX2A0Cpj$%Kz=0d-Nj<7CwQ;qf`4%a$v-%wmGdNYqVH^Ju=AuO zH+$nnZn_yG6$$9U_JaGtellaSYSHBj*pP6IKblZF0ek@Nu$*e4YK|)5kh<5b({19p z@_Y)`o{Xgi!(s&lJ6(c43xDngqs_Sd=3a)p5fKfdU@EMpQ;I#6-;^t0x3iw`vf|8k zhW&Na0iV!Pxc)jHBq+bN^fX*4N#Gh!d(%>cJuvBzBr(i(NNG7YiWqsmFHAm+rG6NJ zK=eDkLMm$fxgTIstwMCyhDfR{9e-Nd5>Mq<;*~-^nA% z;x~B&Zc+z`LO^Q60V5$dAmM*^;e+P~CRgN#yQDe)x?mQUDi~lh@d)+`@eceeED1I; z>rF1QO)4lbRZ0WX-#CZZmNpRy!nbER&gZqkHy)y$ZLaJJCy(doRXeELac+V2CK_hWQ1Z zp=6f&6vx1)QsgzFWLf~fn#Gig3ab9m;zNnK2Dd0A6^5ci?UkQd;l`tU5*xBs3D8J! zH1w(Z#^`T7xX&xEr0Je%fb-?Aq4f;`&2^2T6z=l;fh*>7=~9o+lJXMhYF06qy9|Oo zKZ+{?n;-bA9mW%QBp?r-K(mb5x*XJl?k zU7c1m`UhUuXEs*B%?Z6IEA`c6>&o?O6M=K&k1NEVXI2)p9*5266Q7VW1K29Ff4dzhHYw@TIk9=T88C^{WWACVo^N8y(^ULrh-xij|g zgF9R0X+fxz2^xJEGfN7CSk++XnR4fPX&<|+z5A+i1&VvG0vGN+VLPl(@~dLsktInl z;7ki)o!O4R+ULizLZEe>l*Si3fph`j>Eb5-8Y+=t7;YPev|V5Kj<;1Y?7LpgWy`N~zqIgxNT*^qK5&VL z-yZADw{<%E%3vZq87_c$RiCuLzP&=4z5^q?gvx^R%0A%JTJ8zdRN$TNY<~2W?L+lw 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

*=U4Xgm%Faf{~EvC_b;0DQ8+|W+U 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%0DJBYM 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

@u%s)jMf4Vl? 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 + + 4.0.0 + cds + cds_hrm + 1.1.2 + POM was created from install:install-file + diff --git a/pom.xml b/pom.xml index ab90f0a0a6..916206c8c4 100644 --- a/pom.xml +++ b/pom.xml @@ -60,13 +60,6 @@ http://oscarmcmaster.sourceforge.net/m2 - - - - - - - @@ -611,7 +604,7 @@ cds cds_hrm - 4.3.1 + 1.1.2 @@ -1077,33 +1070,6 @@ 2014.10.24 - - - org.marc.everest - everest-core - 1.1.0 - - - org.marc.everest - everest-rmim-ca-r02-04-03 - 1.1.0 - - - org.marc.everest - everest-rmim-uv-cdar2 - 1.1.0 - - - org.marc.everest - everest-formatters-xml-its1 - 1.1.0 - - - org.marc.everest - everest-formatters-xml-dt-r1 - 1.1.0 - - org.marc.shic diff --git a/src/main/java/org/oscarehr/common/service/E2ESchedulerJob.java b/src/main/java/org/oscarehr/common/service/E2ESchedulerJob.java deleted file mode 100644 index ac580ce996..0000000000 --- a/src/main/java/org/oscarehr/common/service/E2ESchedulerJob.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2013. Department of Family Practice, University of British Columbia. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Practice - * Faculty of Medicine - * University of British Columbia - * Vancouver, Canada - */ -package org.oscarehr.common.service; - -import java.net.NoRouteToHostException; -import java.util.Calendar; -import java.util.Collections; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.TimerTask; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.conn.HttpHostConnectException; -import org.apache.http.entity.mime.MultipartEntity; -import org.apache.http.entity.mime.content.ByteArrayBody; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.logging.log4j.Logger; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.common.dao.DemographicDao; -import org.oscarehr.common.dao.OscarLogDao; -import org.oscarehr.e2e.director.E2ECreator; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.DbConnectionFilter; -import org.oscarehr.util.MiscUtils; -import org.oscarehr.util.SpringUtils; - -import oscar.OscarProperties; -import oscar.util.StringUtils; - -/** - * An E2E scheduler object for periodically exporting all available patient summaries via HTTP POST - * This object extends the JDK TimerTask, but applicationContextE2E.xml uses Quartz scheduling instead - * - * @author Marc Dumontier, Jeremy Ho - */ -public class E2ESchedulerJob extends TimerTask { - private static final Logger logger = MiscUtils.getLogger(); - private static final String e2eUrl = OscarProperties.getInstance().getProperty("E2E_URL"); - private static final String e2eDiff = OscarProperties.getInstance().getProperty("E2E_DIFF"); - private static final String e2eDiffDays = OscarProperties.getInstance().getProperty("E2E_DIFF_DAYS"); - private static final Boolean diffMode = e2eDiff != null && e2eDiff.toLowerCase().equals("on"); - - @Override - public void run() { - DemographicDao demographicDao = SpringUtils.getBean(DemographicDao.class); - OscarLogDao oscarLogDao = SpringUtils.getBean(OscarLogDao.class); - StringBuilder sb = new StringBuilder(255); - Integer success = 0; - Integer failure = 0; - Integer skipped = 0; - Integer diffDays = 14; - List ids = null; - - try { - // Gather demographic numbers for specified mode of operation - if(diffMode) { - if(e2eDiffDays != null && StringUtils.isNumeric(e2eDiffDays)) { - diffDays = Integer.parseInt(e2eDiffDays); - } - - Calendar cal = GregorianCalendar.getInstance(); - cal.add(Calendar.DAY_OF_YEAR, -diffDays); - ids = oscarLogDao.getDemographicIdsOpenedSinceTime(cal.getTime()); - } else { - ids = demographicDao.getActiveDemographicIds(); - } - if(ids != null) Collections.sort(ids); - - // Log Start Header - StringBuilder sbStart = reuseStringBuilder(sb); - sbStart.append("Starting E2E export job\nE2E Target URL: ").append(e2eUrl); - if(diffMode) { - sbStart.append("\nExport Mode: Differential - Days: ").append(diffDays); - } else { - sbStart.append("\nExport Mode: Full"); - } - logger.info(sbStart.toString()); - StringBuilder sbStartRec = reuseStringBuilder(sb); - sbStartRec.append(ids.size()).append(" records pending"); - if(ids.size() > 0) { - sbStartRec.append("\nRange: ").append(ids.get(0)).append(" - ").append(ids.get(ids.size()-1)); - sbStartRec.append(", Median: ").append(ids.get((ids.size()-1)/2)); - } - logger.info(sbStartRec.toString()); - - Long startJob = System.currentTimeMillis(); - Long endJob = startJob; - - for(Integer id:ids) { - Long startLoad = System.currentTimeMillis(); - // Populate Clinical Document - ClinicalDocument clinicalDocument = E2ECreator.createEmrConversionDocument(id); - if(clinicalDocument == null) { - logger.info("[Demo ".concat(id.toString()).concat("] Not active or failed to populate")); - } - Long endLoad = System.currentTimeMillis(); - - Long startGenerate = System.currentTimeMillis(); - // Output Clinical Document as String - String output = EverestUtils.generateDocumentToString(clinicalDocument, true); - Long endGenerate = System.currentTimeMillis(); - - Long startPost = System.currentTimeMillis(); - Long endPost = startPost; - - // Attempt to perform HTTP POST request - try { - if(output != null) { - HttpClient httpclient = new DefaultHttpClient(); - HttpPost httpPost = new HttpPost(e2eUrl); - - // Assemble Multi-part Request - StringBuilder sbFile = reuseStringBuilder(sb); - sbFile.append("Record_").append(id).append(".xml"); - ByteArrayBody body = new ByteArrayBody(output.getBytes(), "text/xml", sbFile.toString()); - MultipartEntity reqEntity = new MultipartEntity(); - reqEntity.addPart("content", body); - httpPost.setEntity(reqEntity); - - // Send HTTP POST request - HttpResponse response = httpclient.execute(httpPost); - if(response != null && response.getStatusLine().getStatusCode() == 201) { - success++; - } else { - logger.warn(response.getStatusLine()); - failure++; - } - } - } catch (HttpHostConnectException e) { - logger.error("Connection to ".concat(e2eUrl).concat(" refused")); - failure++; - } catch (NoRouteToHostException e) { - logger.error("Can't resolve route to ".concat(e2eUrl)); - failure++; - } catch (Exception e) { - logger.error("Error", e); - failure++; - } finally { - endPost = System.currentTimeMillis(); - } - - // Log Record completion + benchmarks - StringBuilder sbTimer = reuseStringBuilder(sb); - sbTimer.append("[Demo: ").append(id); - sbTimer.append("] L:").append( (endLoad - startLoad)/1000.0 ); - sbTimer.append(" G:").append( (endGenerate - startGenerate)/1000.0 ); - sbTimer.append(" P:").append( (endPost - startPost)/1000.0 ); - logger.info(sbTimer.toString()); - } - - endJob = System.currentTimeMillis(); - logger.info("Done E2E export job (" + convertTime(endJob - startJob) + ")"); - } catch(Throwable e) { - logger.error("Error", e); - logger.info("E2E export job aborted"); - } finally { - // Log final record counts - Integer unaccounted = ids.size() - success - failure - skipped; - sb = reuseStringBuilder(sb); - sb.append(success).append(" records processed"); - if(failure > 0) sb.append("\n").append(failure).append(" records failed"); - if(skipped > 0) sb.append("\n").append(skipped).append(" records skipped"); - if(unaccounted > 0) sb.append("\n").append(unaccounted).append(" records unaccounted"); - logger.info(sb.toString()); - DbConnectionFilter.releaseAllThreadDbResources(); - } - } - - /** - * Helper function for reusing a StringBuilder object for efficiency - * Blanks out existing sb contents and returns sb - * - * @param sb - */ - private StringBuilder reuseStringBuilder(final StringBuilder sb) { - sb.delete(0, sb.length()); - return sb; - } - - /** - * Helper function to display time in a nicer readable format - * - * @param time - * @return string - */ - private String convertTime(long time) { - Long ms = time; - Long seconds = time / 1000L; - Long minutes = time / 60000L; - Long hours = time / 3600000L; - return String.format("%02d:%02d:%02d.%03d", hours%24, minutes%60, seconds%60, ms%1000); - } -} diff --git a/src/main/java/org/oscarehr/e2e/constant/Mappings.java b/src/main/java/org/oscarehr/e2e/constant/Mappings.java index c0067492bc..c2f8175e69 100644 --- a/src/main/java/org/oscarehr/e2e/constant/Mappings.java +++ b/src/main/java/org/oscarehr/e2e/constant/Mappings.java @@ -39,8 +39,8 @@ import org.marc.everest.datatypes.generic.PIVL; import org.marc.everest.datatypes.interfaces.ISetComponent; import org.marc.everest.rmim.uv.cdar2.vocabulary.AdministrativeGender; -import org.oscarehr.e2e.constant.Constants.IssueCodes; -import org.oscarehr.e2e.util.EverestUtils; +//import org.oscarehr.e2e.constant.Constants.IssueCodes; +//import org.oscarehr.e2e.util.EverestUtils; public class Mappings { Mappings() { @@ -125,18 +125,18 @@ public class Mappings { allergyTestName = Collections.unmodifiableMap(map); } - public static final Map issueId; - static { - Map map = new HashMap(); - map.put(Constants.IssueCodes.OMeds, EverestUtils.getIssueID(Constants.IssueCodes.OMeds.toString())); - map.put(Constants.IssueCodes.SocHistory, EverestUtils.getIssueID(Constants.IssueCodes.SocHistory.toString())); - map.put(Constants.IssueCodes.MedHistory, EverestUtils.getIssueID(Constants.IssueCodes.MedHistory.toString())); - map.put(Constants.IssueCodes.Concerns, EverestUtils.getIssueID(Constants.IssueCodes.Concerns.toString())); - map.put(Constants.IssueCodes.Reminders, EverestUtils.getIssueID(Constants.IssueCodes.Reminders.toString())); - map.put(Constants.IssueCodes.FamHistory, EverestUtils.getIssueID(Constants.IssueCodes.FamHistory.toString())); - map.put(Constants.IssueCodes.RiskFactors, EverestUtils.getIssueID(Constants.IssueCodes.RiskFactors.toString())); - issueId = Collections.unmodifiableMap(map); - } +// public static final Map issueId; +// static { +// Map map = new HashMap(); +// map.put(Constants.IssueCodes.OMeds, EverestUtils.getIssueID(Constants.IssueCodes.OMeds.toString())); +// map.put(Constants.IssueCodes.SocHistory, EverestUtils.getIssueID(Constants.IssueCodes.SocHistory.toString())); +// map.put(Constants.IssueCodes.MedHistory, EverestUtils.getIssueID(Constants.IssueCodes.MedHistory.toString())); +// map.put(Constants.IssueCodes.Concerns, EverestUtils.getIssueID(Constants.IssueCodes.Concerns.toString())); +// map.put(Constants.IssueCodes.Reminders, EverestUtils.getIssueID(Constants.IssueCodes.Reminders.toString())); +// map.put(Constants.IssueCodes.FamHistory, EverestUtils.getIssueID(Constants.IssueCodes.FamHistory.toString())); +// map.put(Constants.IssueCodes.RiskFactors, EverestUtils.getIssueID(Constants.IssueCodes.RiskFactors.toString())); +// issueId = Collections.unmodifiableMap(map); +// } public static final Map formCode; static { diff --git a/src/main/java/org/oscarehr/e2e/director/E2ECreator.java b/src/main/java/org/oscarehr/e2e/director/E2ECreator.java deleted file mode 100644 index c2b98a27a6..0000000000 --- a/src/main/java/org/oscarehr/e2e/director/E2ECreator.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.director; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.populator.EmrExportPopulator; - -public class E2ECreator { - E2ECreator() { - throw new UnsupportedOperationException(); - } - - public static ClinicalDocument createEmrConversionDocument(Integer demographicNo) { - ClinicalDocument clinicalDocument = null; - PatientExport patientExport = new PatientExport(demographicNo); - - if(patientExport.isActive()) { - CE code = Constants.EMRConversionDocument.CODE; - II templateId = new II(Constants.EMRConversionDocument.TEMPLATE_ID); - - EmrExportPopulator emrExportPopulator = new EmrExportPopulator(patientExport, code, templateId); - emrExportPopulator.populate(); - clinicalDocument = emrExportPopulator.getClinicalDocument(); - } - - return clinicalDocument; - } -} diff --git a/src/main/java/org/oscarehr/e2e/director/E2EParser.java b/src/main/java/org/oscarehr/e2e/director/E2EParser.java deleted file mode 100644 index e6763c052f..0000000000 --- a/src/main/java/org/oscarehr/e2e/director/E2EParser.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.director; - -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; - -public class E2EParser { - E2EParser() { - throw new UnsupportedOperationException(); - } - - public static ClinicalDocument parseEmrConversionDocument() { - throw new UnsupportedOperationException("Not implemented"); - } -} diff --git a/src/main/java/org/oscarehr/e2e/extension/ObservationWithConfidentialityCode.java b/src/main/java/org/oscarehr/e2e/extension/ObservationWithConfidentialityCode.java deleted file mode 100644 index 30bdb18dfe..0000000000 --- a/src/main/java/org/oscarehr/e2e/extension/ObservationWithConfidentialityCode.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.extension; - -import org.marc.everest.annotations.ConformanceType; -import org.marc.everest.annotations.Property; -import org.marc.everest.annotations.PropertyType; -import org.marc.everest.annotations.Structure; -import org.marc.everest.annotations.StructureType; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; - -@Structure(model = "POCD_MT000040", name = "Observation", structureType = StructureType.MESSAGETYPE) -public class ObservationWithConfidentialityCode extends Observation { - private CE confidentialityCode; - - public ObservationWithConfidentialityCode(x_ActMoodDocumentObservation eventoccurrence) { - this.setMoodCode(new CS(eventoccurrence)); - } - - @Property(conformance = ConformanceType.REQUIRED, name = "confidentialityCode", namespaceUri = "http://standards.pito.bc.ca/E2E-DTC/cda", propertyType = PropertyType.NONSTRUCTURAL) - public CE getConfidentialityCode() { - return confidentialityCode; - } - - public void setConfidentialityCode(CE confidentialityCode) { - this.confidentialityCode = confidentialityCode; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/PatientExport.java b/src/main/java/org/oscarehr/e2e/model/PatientExport.java deleted file mode 100644 index 4c3d8904cb..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/PatientExport.java +++ /dev/null @@ -1,573 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.Logger; -import org.oscarehr.casemgmt.dao.CaseManagementIssueDAO; -import org.oscarehr.casemgmt.dao.CaseManagementNoteDAO; -import org.oscarehr.casemgmt.dao.CaseManagementNoteExtDAO; -import org.oscarehr.casemgmt.model.CaseManagementIssue; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.casemgmt.model.CaseManagementNoteExt; -import org.oscarehr.common.dao.AllergyDao; -import org.oscarehr.common.dao.CaseManagementIssueNotesDao; -import org.oscarehr.common.dao.DemographicDao; -import org.oscarehr.common.dao.DrugDao; -import org.oscarehr.common.dao.DxresearchDAO; -import org.oscarehr.common.dao.Hl7TextInfoDao; -import org.oscarehr.common.dao.MeasurementDao; -import org.oscarehr.common.dao.MeasurementsExtDao; -import org.oscarehr.common.dao.PatientLabRoutingDao; -import org.oscarehr.common.dao.PreventionDao; -import org.oscarehr.common.dao.PreventionExtDao; -import org.oscarehr.common.model.Allergy; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.common.model.Drug; -import org.oscarehr.common.model.Dxresearch; -import org.oscarehr.common.model.Hl7TextInfo; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.common.model.MeasurementsExt; -import org.oscarehr.common.model.PatientLabRouting; -import org.oscarehr.common.model.Prevention; -import org.oscarehr.common.model.PreventionExt; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class PatientExport { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - - private DemographicDao demographicDao = null; - private AllergyDao allergyDao = null; - private MeasurementDao measurementDao = null; - private MeasurementsExtDao measurementsExtDao = null; - private CaseManagementIssueDAO caseManagementIssueDao = null; - private CaseManagementIssueNotesDao caseManagementIssueNotesDao = null; - private CaseManagementNoteDAO caseManagementNoteDao = null; - private CaseManagementNoteExtDAO caseManagementNoteExtDao = null; - private PreventionDao preventionDao = null; - private PreventionExtDao preventionExtDao = null; - private PatientLabRoutingDao patientLabRoutingDao = null; - private Hl7TextInfoDao hl7TextInfoDao = null; - private DrugDao drugDao = null; - private DxresearchDAO dxResearchDao = null; - - // Optimization for Measurements since both Labs and CMOs use the same table - private List rawMeasurements = null; - - private Boolean loaded = false; - private Boolean active = false; - private Demographic demographic = null; - private List allergies = null; - private List measurements = null; - private List alerts = null; - private List encounters = null; - private List riskFactors = null; - private List familyHistory = null; - private List immunizations = null; - private List labs = null; - private List drugs = null; - private List problems = null; - - public PatientExport(Integer demographicNo) { - demographicDao = SpringUtils.getBean(DemographicDao.class); - allergyDao = SpringUtils.getBean(AllergyDao.class); - measurementDao = SpringUtils.getBean(MeasurementDao.class); - measurementsExtDao = SpringUtils.getBean(MeasurementsExtDao.class); - caseManagementIssueDao = SpringUtils.getBean(CaseManagementIssueDAO.class); - caseManagementIssueNotesDao = SpringUtils.getBean(CaseManagementIssueNotesDao.class); - caseManagementNoteDao = SpringUtils.getBean(CaseManagementNoteDAO.class); - caseManagementNoteExtDao = SpringUtils.getBean(CaseManagementNoteExtDAO.class); - preventionDao = SpringUtils.getBean(PreventionDao.class); - preventionExtDao = SpringUtils.getBean(PreventionExtDao.class); - patientLabRoutingDao = SpringUtils.getBean(PatientLabRoutingDao.class); - hl7TextInfoDao = SpringUtils.getBean(Hl7TextInfoDao.class); - drugDao = SpringUtils.getBean(DrugDao.class); - dxResearchDao = SpringUtils.getBean(DxresearchDAO.class); - - loaded = loadPatient(demographicNo); - } - - private Boolean loadPatient(Integer demographicNo) { - demographic = demographicDao.getDemographicById(demographicNo); - if(demographic == null) { - log.error("Demographic ".concat(demographicNo.toString()).concat(" can't be loaded")); - return false; - } - - active = "AC".equals(demographic.getPatientStatus()); - - try { - allergies = allergyDao.findAllergies(demographicNo); - } catch (Exception e) { - log.error("loadPatient - Failed to load Allergies", e); - allergies = null; - } - - try { - measurements = assembleMeasurements(demographicNo); - } catch (Exception e) { - log.error("loadPatient - Failed to load Measurements", e); - measurements = null; - } - - try { - encounters = caseManagementNoteDao.getNotesByDemographic(demographicNo.toString()); - } catch (Exception e) { - log.error("loadPatient - Failed to load Encounters", e); - encounters = null; - } - - try { - immunizations = new ArrayList(); - List preventions = preventionDao.findNotDeletedByDemographicId(demographicNo); - for(Prevention prevention : preventions) { - List preventionExts = preventionExtDao.findByPreventionId(prevention.getId()); - immunizations.add(new Immunization(prevention, preventionExts)); - } - } catch (Exception e) { - log.error("loadPatient - Failed to load Immunizations", e); - immunizations = null; - } - - try { - labs = assembleLabs(demographicNo); - } catch (Exception e) { - log.error("loadPatient - Failed to load Labs", e); - labs = null; - } - - try { - drugs = drugDao.findByDemographicId(demographicNo); - } catch (Exception e) { - log.error("loadPatient - Failed to load Medications", e); - drugs = null; - } - - try { - problems = dxResearchDao.getDxResearchItemsByPatient(demographicNo); - } catch (Exception e) { - log.error("loadPatient - Failed to load Problems", e); - problems = null; - } - - parseCaseManagement(demographicNo); - - return true; - } - - private void parseCaseManagement(Integer demographicNo) { - if(encounters != null) { - List caseManagementIssues = caseManagementIssueDao.getIssuesByDemographic(demographicNo.toString()); - List cmRiskFactorIssues = new ArrayList(); - List cmFamilyHistoryIssues = new ArrayList(); - List cmAlertsIssues = new ArrayList(); - - if(caseManagementIssues != null) { - for(CaseManagementIssue entry : caseManagementIssues) { - if(entry.getIssue_id() == Mappings.issueId.get(Constants.IssueCodes.RiskFactors) || - entry.getIssue_id() == Mappings.issueId.get(Constants.IssueCodes.SocHistory)) { - cmRiskFactorIssues.add(entry.getId().toString()); - } - else if(entry.getIssue_id() == Mappings.issueId.get(Constants.IssueCodes.FamHistory)) { - cmFamilyHistoryIssues.add(entry.getId().toString()); - } - else if(entry.getIssue_id() == Mappings.issueId.get(Constants.IssueCodes.Reminders)) { - cmAlertsIssues.add(entry.getId().toString()); - } - } - } - - try { - List cmRiskFactorNotes = caseManagementIssueNotesDao.getNoteIdsWhichHaveIssues(cmRiskFactorIssues.toArray(new String[cmRiskFactorIssues.size()])); - List cmRiskFactorNotesLong = new ArrayList(); - if(cmRiskFactorNotes != null) { - riskFactors = new ArrayList(); - for(Integer i : cmRiskFactorNotes) { - cmRiskFactorNotesLong.add(Long.parseLong(String.valueOf(i))); - } - } - - for(CaseManagementNote entry : encounters) { - if(cmRiskFactorNotesLong.contains(entry.getId())) { - riskFactors.add(entry); - } - } - } catch (Exception e) { - log.error("loadPatient - Failed to load Risk Factors/Personal History", e); - riskFactors = null; - } - - try { - List cmFamilyHistoryNotes = caseManagementIssueNotesDao.getNoteIdsWhichHaveIssues(cmFamilyHistoryIssues.toArray(new String[cmFamilyHistoryIssues.size()])); - List cmFamilyHistoryNotesLong = new ArrayList(); - if(cmFamilyHistoryNotes != null) { - familyHistory = new ArrayList(); - for(Integer i : cmFamilyHistoryNotes) { - cmFamilyHistoryNotesLong.add(Long.parseLong(String.valueOf(i))); - } - } - - for(CaseManagementNote entry : encounters) { - if(cmFamilyHistoryNotesLong.contains(entry.getId())) { - List noteExts = caseManagementNoteExtDao.getExtByNote(entry.getId()); - familyHistory.add(new FamilyHistoryEntry(entry, noteExts)); - } - } - - } catch (Exception e) { - log.error("loadPatient - Failed to load Family History", e); - familyHistory = null; - } - - try { - List cmAlertsNotes = caseManagementIssueNotesDao.getNoteIdsWhichHaveIssues(cmAlertsIssues.toArray(new String[cmAlertsIssues.size()])); - List cmAlertsLong = new ArrayList(); - if(cmAlertsNotes != null) { - alerts = new ArrayList(); - for(Integer i : cmAlertsNotes) { - cmAlertsLong.add(Long.parseLong(String.valueOf(i))); - } - } - - for(CaseManagementNote entry : encounters) { - if(cmAlertsLong.contains(entry.getId())) { - alerts.add(entry); - } - } - } catch (Exception e) { - log.error("loadPatient - Failed to load Alerts", e); - alerts = null; - } - } - } - - private List assembleMeasurements(Integer demographicNo) { - // Gather and filter Measurements based on existence of lab_no field - if(rawMeasurements == null) { - rawMeasurements = measurementDao.findByDemographicNo(demographicNo); - } - List cmoMeasurements = new ArrayList(); - for(Measurement measurement : rawMeasurements) { - MeasurementsExt labNo = measurementsExtDao.getMeasurementsExtByMeasurementIdAndKeyVal(measurement.getId(), Constants.MeasurementsExtKeys.lab_no.toString()); - if(labNo == null) { - cmoMeasurements.add(measurement); - } - } - - if(cmoMeasurements.isEmpty()) { - return null; - } - return cmoMeasurements; - } - - private List assembleLabs(Integer demographicNo) { - // Gather Hl7TextInfo labs - List tempRouting = patientLabRoutingDao.findByDemographicAndLabType(demographicNo, "HL7"); - List allHl7TextInfo = new ArrayList(); - for(PatientLabRouting routing : tempRouting) { - Hl7TextInfo temp = hl7TextInfoDao.findLabId(routing.getLabNo()); - if(temp != null) { - allHl7TextInfo.add(temp); - } - } - - // Short circuit if no labs - if(allHl7TextInfo.isEmpty()) { - return null; - } - - // Gather and filter Measurements based on existence of lab_no field - if(rawMeasurements == null) { - rawMeasurements = measurementDao.findByDemographicNo(demographicNo); - } - List allLabComponents = new ArrayList(); - for(Measurement measurement : rawMeasurements) { - MeasurementsExt labNo = measurementsExtDao.getMeasurementsExtByMeasurementIdAndKeyVal(measurement.getId(), Constants.MeasurementsExtKeys.lab_no.toString()); - - // Gather MeasurementsExt and pair with Measurements into LabComponents - if(isValidLabMeasurement(tempRouting, labNo)) { - List measurementsExts = measurementsExtDao.getMeasurementsExtByMeasurementId(measurement.getId()); - allLabComponents.add(new LabComponent(measurement, measurementsExts)); - } - } - - // Create Lab Observations - List allLabs = new ArrayList(); - for(Hl7TextInfo labReport : allHl7TextInfo) { - Lab labObservation = new Lab(labReport); - - // Get LabComponents in this Lab Observation - Integer labNumber = labReport.getLabNumber(); - List tempLabComponents = new ArrayList(); - for(LabComponent labComponent : allLabComponents) { - String componentLabNumber = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.lab_no.toString()); - if(Integer.valueOf(componentLabNumber) == labNumber) { - if(EverestUtils.isNullorEmptyorWhitespace(labObservation.getRequestDate())) { - labObservation.setRequestDate(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.request_datetime.toString())); - } - tempLabComponents.add(labComponent); - } - } - - // Cluster LabComponents into LabOrganizers - Integer prevOrganizer = 0; - LabOrganizer tempLabOrganizer = new LabOrganizer(prevOrganizer, labReport.getReportStatus()); - for(LabComponent labComponent : tempLabComponents) { - String rawOtherId = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.other_id.toString()); - if(!EverestUtils.isNullorEmptyorWhitespace(rawOtherId)) { - Integer currOrganizer = parseOtherID(rawOtherId)[0]; - - // Create New LabOrganizer Group - if(prevOrganizer != currOrganizer) { - labObservation.getLabOrganizer().add(tempLabOrganizer); - prevOrganizer = currOrganizer; - tempLabOrganizer = new LabOrganizer(prevOrganizer, labReport.getReportStatus()); - } - } - - // Add current LabComponent to LabOrganizer - tempLabOrganizer.getLabComponent().add(labComponent); - } - - // Save final LabOrganizer and Lab Observation - labObservation.getLabOrganizer().add(tempLabOrganizer); - allLabs.add(labObservation); - } - - return allLabs; - } - - private Boolean isValidLabMeasurement(List routing, MeasurementsExt lab_no) { - if(lab_no != null) { - Integer labNo = Integer.parseInt(lab_no.getVal()); - for(PatientLabRouting entry : routing) { - if(entry.getLabNo() == labNo) { - return true; - } - } - } - return false; - } - - private Integer[] parseOtherID(String rhs) { - Integer[] lhs = null; - try { - String[] temp = rhs.split("-"); - lhs = new Integer[temp.length]; - for(int i=0; i < temp.length; i++) { - lhs[i] = Integer.parseInt(temp[i]); - } - } catch (Exception e) { - log.error("parseOtherID - other_id field not in expected format"); - } - - return lhs; - } - - // PatientExport Standard Interface - public Boolean isLoaded() { - return loaded; - } - - public Boolean isActive() { - return active; - } - - public Demographic getDemographic() { - return demographic; - } - - public List getAllergies() { - return allergies; - } - - public List getMeasurements() { - return measurements; - } - - public List getAlerts() { - return alerts; - } - - public List getEncounters() { - return encounters; - } - - public List getFamilyHistory() { - return familyHistory; - } - - public List getRiskFactors() { - return riskFactors; - } - - public List getImmunizations() { - return immunizations; - } - - public List getLabs() { - return labs; - } - - public List getMedications() { - return drugs; - } - - public List getProblems() { - return problems; - } - - // Supporting Family History Subclass - public static class FamilyHistoryEntry { - private CaseManagementNote familyHistory = new CaseManagementNote(); - private Map extMap = new HashMap(); - - public FamilyHistoryEntry(CaseManagementNote familyHistory, List extMap) { - if(familyHistory != null) { - this.familyHistory = familyHistory; - } - if(extMap != null) { - for(CaseManagementNoteExt extElement : extMap) { - this.extMap.put(extElement.getKeyVal(), extElement.getValue()); - } - } - } - - public CaseManagementNote getFamilyHistory() { - return familyHistory; - } - - public Map getExtMap() { - return extMap; - } - } - - // Supporting Immunization Subclass - public static class Immunization { - private Prevention prevention = new Prevention(); - private Map preventionMap = new HashMap(); - - public Immunization(Prevention prevention, List preventionExt) { - if(prevention != null) { - this.prevention = prevention; - } - if(preventionExt != null) { - for(PreventionExt extElement : preventionExt) { - this.preventionMap.put(extElement.getkeyval(), extElement.getVal()); - } - } - } - - public Prevention getPrevention() { - return prevention; - } - - public Map getPreventionMap() { - return preventionMap; - } - } - - // Supporting Lab Grouping Subclasses - public static class Lab { - private Hl7TextInfo hl7TextInfo = new Hl7TextInfo(); - private List labOrganizer = new ArrayList(); - private String requestDate = null; - - public Lab(Hl7TextInfo hl7TextInfo) { - if(hl7TextInfo != null) { - this.hl7TextInfo = hl7TextInfo; - } - } - - public Hl7TextInfo getHl7TextInfo() { - return hl7TextInfo; - } - - public List getLabOrganizer() { - return labOrganizer; - } - - public String getRequestDate() { - return requestDate; - } - - public void setRequestDate(String requestDate) { - this.requestDate = requestDate; - } - } - - public static class LabOrganizer { - private Integer id = Constants.Runtime.INVALID_VALUE; - private String reportStatus = null; - private List labComponent = new ArrayList(); - - public LabOrganizer(Integer id, String reportStatus) { - this.id = id; - this.reportStatus = reportStatus; - } - - public Integer getGroupId() { - return id; - } - - public String getReportStatus() { - return reportStatus; - } - - public List getLabComponent() { - return labComponent; - } - } - - public static class LabComponent { - private Measurement measurement = new Measurement(); - private Map measurementsMap = new HashMap(); - - public LabComponent(Measurement measurement, List measurementsExt) { - if(measurement != null) { - this.measurement = measurement; - } - if(measurementsExt != null) { - for(MeasurementsExt extElement : measurementsExt) { - this.measurementsMap.put(extElement.getKeyVal(), extElement.getVal()); - } - } - } - - public Measurement getMeasurement() { - return measurement; - } - - public Map getMeasurementsMap() { - return measurementsMap; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/AlertsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/AlertsModel.java deleted file mode 100644 index 9f219463d3..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/AlertsModel.java +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class AlertsModel { - private CaseManagementNote alert; - - private SET ids; - private CD code; - private ED text; - private ActStatus statusCode; - private IVL effectiveTime; - private CE confidentiality; - - public AlertsModel(CaseManagementNote alert) { - if(alert == null) { - this.alert = new CaseManagementNote(); - } else { - this.alert = alert; - } - - setIds(); - setCode(); - setText(); - setStatusCode(); - setEffectiveTime(); - setConfidentiality(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(alert.getObservation_date() != null) { - sb.append(alert.getObservation_date()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(alert.getNote())) { - sb.append(" ".concat(alert.getNote().replaceAll("\\\\n", "\n"))); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Alerts, alert.getId()); - } - - public CD getCode() { - return code; - } - - public void setCode() { - CD code = new CD(); - code.setNullFlavor(NullFlavor.NoInformation); - this.code = code; - } - - public ED getText() { - return text; - } - - private void setText() { - ED text = new ED(); - if(!EverestUtils.isNullorEmptyorWhitespace(alert.getNote())) { - text.setData(alert.getNote()); - } else { - text.setNullFlavor(NullFlavor.NoInformation); - } - this.text = text; - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(!alert.isArchived()) { - this.statusCode = ActStatus.Active; - } else { - this.statusCode = ActStatus.Completed; - } - } - - public IVL getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - IVL ivl = new IVL(); - TS startTime = EverestUtils.buildTSFromDate(alert.getObservation_date()); - if(startTime != null) { - ivl.setLow(startTime); - } else { - ivl.setNullFlavor(NullFlavor.NoInformation); - } - - this.effectiveTime = ivl; - } - - public CE getConfidentiality() { - return confidentiality; - } - - private void setConfidentiality() { - this.confidentiality = new CE(x_BasicConfidentialityKind.Normal); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/AllergiesModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/AllergiesModel.java deleted file mode 100644 index 81f638b55e..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/AllergiesModel.java +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.common.model.Allergy; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.template.observation.LifestageObservationModel; -import org.oscarehr.e2e.model.export.template.observation.ReactionObservationModel; -import org.oscarehr.e2e.model.export.template.observation.SeverityObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class AllergiesModel { - private Allergy allergy; - - private SET ids; - private CD code; - private ActStatus statusCode; - private IVL effectiveTime; - private EntryRelationship allergyObservation; - - public AllergiesModel(Allergy allergy) { - if(allergy == null) { - this.allergy = new Allergy(); - } else { - this.allergy = allergy; - } - - setIds(); - setCode(); - setStatusCode(); - setEffectiveTime(); - setAllergyObservation(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(allergy.getDescription())) { - sb.append(allergy.getDescription()); - } - if(allergy.getEntryDate() != null) { - sb.append(" " + allergy.getEntryDate().toString()); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Allergies, allergy.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - CD code = new CD("48765-2", Constants.CodeSystems.LOINC_OID, - Constants.CodeSystems.LOINC_NAME, Constants.CodeSystems.LOINC_VERSION); - this.code = code; - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(allergy.getArchived()) { - this.statusCode = ActStatus.Completed; - } else { - this.statusCode = ActStatus.Active; - } - } - - public IVL getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - IVL ivl = new IVL(); - TS startTime = EverestUtils.buildTSFromDate(allergy.getEntryDate()); - if(startTime != null) { - ivl.setLow(startTime); - } else { - ivl.setNullFlavor(NullFlavor.Unknown); - } - - this.effectiveTime = ivl; - } - - public EntryRelationship getAllergyObservation() { - return allergyObservation; - } - - private void setAllergyObservation() { - EntryRelationship entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.HasComponent, new BL(true)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - observation.setCode(getAdverseEventCode()); - observation.setEffectiveTime(getOnsetDate()); - observation.setParticipant(getAllergen()); - - entryRelationships.add(getAllergenGroup()); - entryRelationships.add(getLifestage()); - entryRelationships.add(getReaction()); - entryRelationships.add(getSeverity()); - entryRelationships.add(getClinicalStatus()); - - observation.setEntryRelationship(entryRelationships); - entryRelationship.setClinicalStatement(observation); - - this.allergyObservation = entryRelationship; - } - - protected CD getAdverseEventCode() { - CD code = new CD(); - if(Mappings.reactionTypeCode.containsKey(allergy.getTypeCode())) { - code.setCodeEx(Mappings.reactionTypeCode.get(allergy.getTypeCode())); - code.setCodeSystem(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - } else { - code.setNullFlavor(NullFlavor.Unknown); - } - - return code; - } - - protected IVL getOnsetDate() { - IVL ivl = new IVL(); - TS startTime = EverestUtils.buildTSFromDate(allergy.getStartDate()); - if(startTime != null) { - ivl.setLow(startTime); - } else { - ivl.setNullFlavor(NullFlavor.Unknown); - } - - return ivl; - } - - protected ArrayList getAllergen() { - Participant2 participant = new Participant2(ParticipationType.Consumable, ContextControl.OverridingPropagating); - ParticipantRole participantRole = new ParticipantRole(new CD(Constants.RoleClass.MANU.toString())); - PlayingEntity playingEntity = new PlayingEntity(EntityClassRoot.ManufacturedMaterial); - - CE code = new CE(); - if(!EverestUtils.isNullorEmptyorWhitespace(allergy.getRegionalIdentifier())) { - code.setCodeEx(allergy.getRegionalIdentifier()); - code.setCodeSystem(Constants.CodeSystems.DIN_OID); - code.setCodeSystemName(Constants.CodeSystems.DIN_NAME); - } else { - code.setNullFlavor(NullFlavor.NoInformation); - } - - SET names = new SET(new PN(null, Arrays.asList(new ENXP(allergy.getDescription())))); - - playingEntity.setCode(code); - playingEntity.setName(names); - - participantRole.setPlayingEntityChoice(playingEntity); - participant.setParticipantRole(participantRole); - - return new ArrayList(Arrays.asList(participant)); - } - - protected EntryRelationship getAllergenGroup() { - EntryRelationship entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.HasComponent, new BL(true)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - CD code = new CD(Constants.ObservationType.ALRGRP.toString(), Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - - CD value = new CD(); - value.setNullFlavor(NullFlavor.NoInformation); - - observation.setCode(code); - observation.setValue(value); - - entryRelationship.setClinicalStatement(observation); - return entryRelationship; - } - - protected EntryRelationship getLifestage() { - return new LifestageObservationModel().getEntryRelationship(allergy.getLifeStage()); - } - - protected EntryRelationship getReaction() { - return new ReactionObservationModel().getEntryRelationship(allergy.getReaction(), allergy.getStartDate(), allergy.getProviderNo(), allergy.getEntryDate(), allergy.getSeverityOfReaction()); - } - - protected EntryRelationship getSeverity() { - return new SeverityObservationModel().getEntryRelationship(allergy.getSeverityOfReaction()); - } - - protected EntryRelationship getClinicalStatus() { - EntryRelationship entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.SUBJ, new BL(true)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - CD code = new CD(Constants.ObservationType.CLINSTAT.toString(), Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID); - code.setCodeSystemName(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME); - - ED text = new ED(); - text.setNullFlavor(NullFlavor.NoInformation); - - CD value = new CD(); - value.setNullFlavor(NullFlavor.NoInformation); - - observation.setCode(code); - observation.setText(text); - observation.setValue(value); - - entryRelationship.setClinicalStatement(observation); - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java deleted file mode 100644 index 0426ab7b91..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.constant.BodyConstants.ClinicallyMeasuredObservations; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ClinicallyMeasuredObservationsModel { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - private Measurement measurement; - - private SET ids; - private CD code; - private ActStatus statusCode; - private ArrayList authors; - - public ClinicallyMeasuredObservationsModel(Measurement measurement) { - if(measurement == null) { - this.measurement = new Measurement(); - } else { - this.measurement = measurement; - } - - setIds(); - setCode(); - setStatusCode(); - setAuthor(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(EverestUtils.getTypeDescription(measurement.getType()))) { - sb.append(EverestUtils.getTypeDescription(measurement.getType())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getDataField())) { - sb.append(": ".concat(measurement.getDataField())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(Mappings.measurementUnitMap.get(measurement.getType()))) { - sb.append(" ".concat(Mappings.measurementUnitMap.get(measurement.getType()))); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getMeasuringInstruction())) { - sb.append(" (".concat(measurement.getMeasuringInstruction()).concat(")")); - } - if(measurement.getDateObserved() != null) { - sb.append(" ".concat(measurement.getDateObserved().toString())); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.ClinicalMeasuredObservations, measurement.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(); - this.code.setNullFlavor(NullFlavor.NoInformation); - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - this.statusCode = ActStatus.Completed; - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - this.authors = new ArrayList(); - this.authors.add(new AuthorParticipationModel(measurement.getProviderNo()).getAuthor(measurement.getCreateDate())); - } - - public ArrayList getComponents() { - ArrayList components = new ArrayList(); - if(ClinicallyMeasuredObservations.BLOOD_PRESSURE_CODE.equals(measurement.getType())) { - // Parse Systolic and Diastolic Blood Pressure integers - Pattern pattern = Pattern.compile("\\d+"); - Matcher matcher = pattern.matcher(measurement.getDataField()); - List values = new ArrayList(); - while(matcher.find()) { - values.add(Integer.parseInt(matcher.group())); - } - - // Make a deep copy of measurement object - Measurement tempMeasurement = null; - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream out = new ObjectOutputStream(bos); - out.writeObject(measurement); - out.flush(); - out.close(); - ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); - tempMeasurement = (Measurement) in.readObject(); - } catch(Exception e) { - log.error(e.toString(), e); - } - - // Add Systolic Component - tempMeasurement.setType(ClinicallyMeasuredObservations.DIASTOLIC_CODE); - tempMeasurement.setDataField(values.get(0).toString()); - components.add(new ComponentObservation().getComponent(tempMeasurement)); - - // Add Diastolic Component - tempMeasurement.setType(ClinicallyMeasuredObservations.SYSTOLIC_CODE); - tempMeasurement.setDataField(values.get(1).toString()); - components.add(new ComponentObservation().getComponent(tempMeasurement)); - } else { - components.add(new ComponentObservation().getComponent(measurement)); - } - - return components; - } - - class ComponentObservation { - private Measurement measurement; - - public Component4 getComponent(Measurement measurement) { - if(measurement == null) { - this.measurement = new Measurement(); - } else { - this.measurement = measurement; - } - - Component4 component = new Component4(ActRelationshipHasComponent.HasComponent, new BL(true)); - Observation observation = new Observation(); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.setId(getComponentIds()); - observation.setCode(getComponentCode()); - observation.setText(getComponentText()); - observation.setEffectiveTime(getComponentTime()); - observation.setValue(getComponentValue()); - - component.setClinicalStatement(observation); - return component; - } - - private SET getComponentIds() { - return EverestUtils.buildUniqueId(Constants.IdPrefixes.ClinicalMeasuredObservations, measurement.getId()); - } - - private CD getComponentCode() { - CD code = new CD(); - if(Mappings.measurementCodeMap.get(measurement.getType()) != null) { - code.setCodeEx(Mappings.measurementCodeMap.get(measurement.getType())); - code.setCodeSystem(Constants.CodeSystems.LOINC_OID); - code.setCodeSystemName(Constants.CodeSystems.LOINC_NAME); - code.setCodeSystemVersion(Constants.CodeSystems.LOINC_VERSION); - } else { - code.setNullFlavor(NullFlavor.Unknown); - } - return code; - } - - private ED getComponentText() { - String text = new String(); - if(!EverestUtils.isNullorEmptyorWhitespace(EverestUtils.getTypeDescription(measurement.getType()))) { - text = EverestUtils.getTypeDescription(measurement.getType()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getMeasuringInstruction())) { - text = text.concat(" (").concat(measurement.getMeasuringInstruction().concat(")")); - } - - if(!text.isEmpty()) { - return new ED(text); - } - return null; - } - - private IVL getComponentTime() { - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(measurement.getDateObserved(), TS.SECONDNOTIMEZONE); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - return ivl; - } - - private ANY getComponentValue() { - String dataField = measurement.getDataField(); - String unit = Mappings.measurementUnitMap.get(measurement.getType()); - ANY value = null; - if(!EverestUtils.isNullorEmptyorWhitespace(dataField)) { - if(!EverestUtils.isNullorEmptyorWhitespace(unit)) { - try { - value = new PQ(new BigDecimal(dataField), unit.replaceAll("\\s","_")); - } catch (NumberFormatException e) { - value = new ST(dataField.concat(" ").concat(unit)); - } - } else { - value = new ST(dataField); - } - } - - return value; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/EncountersModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/EncountersModel.java deleted file mode 100644 index 21888027c4..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/EncountersModel.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.model.export.template.ProviderParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class EncountersModel { - private CaseManagementNote encounter; - - private SET ids; - private IVL effectiveTime; - private Participant2 encounterLocation; - private Participant2 encounterProvider; - private EntryRelationship encounterNote; - - public EncountersModel(CaseManagementNote encounter) { - if(encounter == null) { - this.encounter = new CaseManagementNote(); - } else { - this.encounter = encounter; - } - - setIds(); - setEffectiveTime(); - setEncounterLocation(); - setEncounterProvider(); - setEncounterNote(); - // Reason Observation not included because icd9 code doesn't fit in Reason Observation template - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(encounter.getObservation_date() != null) { - sb.append(encounter.getObservation_date()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(encounter.getNote())) { - sb.append(" ".concat(encounter.getNote().replaceAll("\\\\n", "\n"))); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Encounters, encounter.getId()); - } - - public IVL getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(encounter.getObservation_date()); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - this.effectiveTime = ivl; - } - - public Participant2 getEncounterLocation() { - return encounterLocation; - } - - private void setEncounterLocation() { - Participant2 participant = new Participant2(ParticipationType.LOC, ContextControl.OverridingPropagating); - ParticipantRole participantRole = new ParticipantRole(new CD(Constants.RoleClass.SDLOC.toString())); - PlayingEntity playingEntity = new PlayingEntity(EntityClassRoot.Organization); - - participantRole.setPlayingEntityChoice(playingEntity); - participant.setParticipantRole(participantRole); - - this.encounterLocation = participant; - } - - public Participant2 getEncounterProvider() { - return encounterProvider; - } - - private void setEncounterProvider() { - this.encounterProvider = new ProviderParticipationModel(encounter.getProviderNo()).getProvider(); - } - - public EntryRelationship getEncounterNote() { - return encounterNote; - } - - private void setEncounterNote() { - EntryRelationship entryRelationship = null; - if(!EverestUtils.isNullorEmptyorWhitespace(encounter.getNote())) { - entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.SUBJ, new BL(true)); - - CD code = new CD(Constants.ObservationType.COMMENT.toString()); - code.setCodeSystem(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID); - code.setCodeSystemName(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME); - - ST value = new ST(encounter.getNote().replaceAll("\\\\n", "\n")); - - ArrayList authors = new ArrayList(); - authors.add(new AuthorParticipationModel(encounter.getSigning_provider_no()).getAuthor(encounter.getUpdate_date())); - - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - observation.setId(getIds()); - observation.setCode(code); - observation.setEffectiveTime(getEffectiveTime()); - observation.setValue(value); - observation.setAuthor(authors); - - entryRelationship.setClinicalStatement(observation); - } - - this.encounterNote = entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModel.java deleted file mode 100644 index 72e5373d27..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModel.java +++ /dev/null @@ -1,246 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.INT; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.RelatedSubject; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Subject; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubject; -import org.oscarehr.casemgmt.model.CaseManagementNoteExt; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.PatientExport.FamilyHistoryEntry; -import org.oscarehr.e2e.model.export.template.observation.LifestageObservationModel; -import org.oscarehr.e2e.model.export.template.observation.SecondaryCodeICD9ObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class FamilyHistoryModel { - private FamilyHistoryEntry familyHistory; - - private SET ids; - private CD code; - private ED text; - private IVL effectiveTime; - private CD value; - private Subject subject; - private EntryRelationship treatmentComment; - private EntryRelationship billingCode; - private EntryRelationship lifestageOnset; - private EntryRelationship ageAtOnset; - - public FamilyHistoryModel(FamilyHistoryEntry familyHistoryEntry) { - if(familyHistoryEntry == null) { - this.familyHistory = new FamilyHistoryEntry(null, null); - } else { - this.familyHistory = familyHistoryEntry; - } - - setIds(); - setCode(); - setText(); - setEffectiveTime(); - setValue(); - setSubject(); - setTreatmentComment(); - setBillingCode(); - setLifestageOnset(); - setAgeAtOnset(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(familyHistory.getFamilyHistory().getObservation_date() != null) { - sb.append(familyHistory.getFamilyHistory().getObservation_date()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(familyHistory.getFamilyHistory().getNote())) { - sb.append(" ".concat(familyHistory.getFamilyHistory().getNote().replaceAll("\\\\n", "\n"))); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.FamilyHistory, familyHistory.getFamilyHistory().getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(); - this.code.setNullFlavor(NullFlavor.NoInformation); - } - - public ED getText() { - return text; - } - - private void setText() { - ED text = null; - if(!EverestUtils.isNullorEmptyorWhitespace(familyHistory.getFamilyHistory().getNote())) { - text = new ED(familyHistory.getFamilyHistory().getNote()); - } - this.text = text; - } - - public IVL getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - IVL ivl = new IVL(); - TS startTime = EverestUtils.buildTSFromDate(familyHistory.getFamilyHistory().getObservation_date()); - if(startTime != null) { - ivl.setLow(startTime); - } else { - ivl.setNullFlavor(NullFlavor.NoInformation); - } - - this.effectiveTime = ivl; - } - - public CD getValue() { - return value; - } - - private void setValue() { - this.value = new CD(); - this.value.setNullFlavor(NullFlavor.Unknown); - } - - public Subject getSubject() { - return subject; - } - - private void setSubject() { - RelatedSubject relatedSubject = new RelatedSubject(x_DocumentSubject.PersonalRelationship); - Subject subject = new Subject(ContextControl.OverridingPropagating, relatedSubject); - - String relationship = familyHistory.getExtMap().get(CaseManagementNoteExt.RELATIONSHIP); - CE code = new CE(); - if(!EverestUtils.isNullorEmptyorWhitespace(relationship)) { - code.setCodeSystem(Constants.CodeSystems.ROLE_CODE_OID); - code.setCodeSystemName(Constants.CodeSystems.ROLE_CODE_NAME); - code.setDisplayName(relationship); - if(Mappings.personalRelationshipRole.containsKey(relationship.toLowerCase())) { - code.setCodeEx(Mappings.personalRelationshipRole.get(relationship.toLowerCase())); - } else { - code.setCodeEx("OTH"); - } - } else { - code.setNullFlavor(NullFlavor.NoInformation); - } - relatedSubject.setCode(code); - - this.subject = subject; - } - - public EntryRelationship getTreatmentComment() { - return treatmentComment; - } - - private void setTreatmentComment() { - EntryRelationship entryRelationship = null; - - if(!EverestUtils.isNullorEmptyorWhitespace(familyHistory.getExtMap().get(CaseManagementNoteExt.TREATMENT))) { - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.SUBJ, new BL(true), observation); - - CD code = new CD(Constants.ObservationType.TRTNOTE.toString(), Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID); - code.setCodeSystemName(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME); - - CD value = new CD(); - value.setNullFlavor(NullFlavor.NoInformation); - - observation.setCode(code); - observation.setText(new ED(familyHistory.getExtMap().get(CaseManagementNoteExt.TREATMENT))); - observation.setValue(value); - } - - this.treatmentComment = entryRelationship; - } - - public EntryRelationship getBillingCode() { - return billingCode; - } - - private void setBillingCode() { - this.billingCode = new SecondaryCodeICD9ObservationModel().getEntryRelationship(familyHistory.getFamilyHistory().getBilling_code()); - } - - public EntryRelationship getLifestageOnset() { - return lifestageOnset; - } - - private void setLifestageOnset() { - this.lifestageOnset = new LifestageObservationModel().getEntryRelationship(familyHistory.getExtMap().get(CaseManagementNoteExt.LIFESTAGE)); - } - - public EntryRelationship getAgeAtOnset() { - return ageAtOnset; - } - - private void setAgeAtOnset() { - EntryRelationship entryRelationship = null; - - try { - Integer age = Integer.parseInt(familyHistory.getExtMap().get(CaseManagementNoteExt.AGEATONSET)); - INT value = new INT(age); - - CD code = new CD("30972-4", Constants.CodeSystems.LOINC_OID); - code.setCodeSystemName(Constants.CodeSystems.LOINC_NAME); - code.setDisplayName("Age at onset"); - - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - entryRelationship = new EntryRelationship(x_ActRelationshipEntryRelationship.HasComponent, new BL(true), observation); - - observation.setCode(code); - observation.setValue(value); - } catch (Exception e) { - entryRelationship = null; - } - - this.ageAtOnset = entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/ImmunizationsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/ImmunizationsModel.java deleted file mode 100644 index ae221e7162..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/ImmunizationsModel.java +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.datatypes.interfaces.ISetComponent; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Immunization; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.model.export.template.ConsumableModel; -import org.oscarehr.e2e.model.export.template.observation.CommentObservationModel; -import org.oscarehr.e2e.model.export.template.observation.DateObservationModel; -import org.oscarehr.e2e.model.export.template.observation.ReasonObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ImmunizationsModel { - private Immunization immunization; - - private BL negationInd; - private SET ids; - private CD code; - private ArrayList> effectiveTime; - private CE route; - private Consumable consumable; - private ArrayList authors; - private ArrayList participant; - private EntryRelationship antigenType; - private EntryRelationship refusalReason; - private EntryRelationship nextDate; - private EntryRelationship comment; - - public ImmunizationsModel(Immunization immunization) { - if(immunization == null) { - this.immunization = new Immunization(null, null); - } else { - this.immunization = immunization; - } - - setNegationInd(); - setIds(); - setCode(); - setEffectiveTime(); - setRoute(); - // Dose not included because freetext dose can't be converted to IVL_PQ representation safely - setConsumable(); - setAuthor(); - setParticipant(); - setAntigenType(); - setRefusalReason(); - setNextDate(); - setComment(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(immunization.getPrevention().getPreventionType())) { - sb.append(immunization.getPrevention().getPreventionType()); - } - if(immunization.getPrevention().getPreventionDate() != null) { - sb.append(" " + immunization.getPrevention().getPreventionDate()); - } - if(immunization.getPrevention().isRefused()) { - sb.append(" Refused"); - } else if(immunization.getPrevention().isIneligible()) { - sb.append(" Ineligible"); - } else { - sb.append(" Completed"); - } - - return sb.toString(); - } - - public BL getNegationInd() { - return negationInd; - } - - private void setNegationInd() { - Boolean isNegated = immunization.getPrevention().isRefused() || immunization.getPrevention().isIneligible(); - this.negationInd = new BL(isNegated); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Immunizations, immunization.getPrevention().getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(Constants.SubstanceAdministrationType.IMMUNIZ.toString(), Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - this.code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - } - - public ArrayList> getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - TS startTime = EverestUtils.buildTSFromDate(immunization.getPrevention().getPreventionDate()); - - IVL ivl = new IVL(); - if(startTime == null) { - startTime = new TS(); - startTime.setNullFlavor(NullFlavor.Unknown); - } - ivl.setLow(startTime); - - this.effectiveTime = new ArrayList>(); - this.effectiveTime.add(ivl); - } - - public CE getRoute() { - return route; - } - - private void setRoute() { - CE route = null; - if(!EverestUtils.isNullorEmptyorWhitespace(immunization.getPreventionMap().get(Constants.PreventionExtKeys.route.toString()))) { - route = new CE(); - route.setNullFlavor(NullFlavor.Other); - route.setCodeSystem(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_OID); - route.setCodeSystemName(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_NAME); - route.setOriginalText(new ED(immunization.getPreventionMap().get(Constants.PreventionExtKeys.route.toString()))); - } - - this.route = route; - } - - public Consumable getConsumable() { - return consumable; - } - - private void setConsumable() { - this.consumable = new ConsumableModel().getConsumable(immunization); - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - ArrayList authors = new ArrayList(); - authors.add(new AuthorParticipationModel(immunization.getPrevention().getProviderNo()).getAuthor(immunization.getPrevention().getCreationDate())); - this.authors = authors; - } - - public ArrayList getParticipant() { - return participant; - } - - private void setParticipant() { - Participant2 participant = new Participant2(ParticipationType.LOC, ContextControl.OverridingPropagating); - ParticipantRole participantRole = new ParticipantRole(new CD(Constants.RoleClass.SDLOC.toString())); - PlayingEntity playingEntity = new PlayingEntity(EntityClassRoot.Organization); - - if(!EverestUtils.isNullorEmptyorWhitespace(immunization.getPreventionMap().get(Constants.PreventionExtKeys.location.toString()))) { - SET names = new SET(); - ArrayList name = new ArrayList(); - name.add(new ENXP(immunization.getPreventionMap().get(Constants.PreventionExtKeys.location.toString()))); - names.add(new PN(null, name)); - playingEntity.setName(names); - } - - participantRole.setPlayingEntityChoice(playingEntity); - participant.setParticipantRole(participantRole); - - this.participant = new ArrayList(Arrays.asList(participant)); - } - - public EntryRelationship getAntigenType() { - return antigenType; - } - - private void setAntigenType() { - Immunization immunization = null; - EntryRelationship entryRelationship = new EntryRelationship(); - Consumable consumable = new ConsumableModel().getConsumable(immunization); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.Eventoccurrence, consumable); - - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setClinicalStatement(substanceAdministration); - - this.antigenType = entryRelationship; - } - - public EntryRelationship getRefusalReason() { - return refusalReason; - } - - private void setRefusalReason() { - this.refusalReason = new ReasonObservationModel().getEntryRelationship(immunization.getPreventionMap().get(Constants.PreventionExtKeys.neverReason.toString()), immunization.getPrevention().getCreationDate(), immunization.getPrevention().getProviderNo()); - } - - public EntryRelationship getNextDate() { - return nextDate; - } - - private void setNextDate() { - this.nextDate = new DateObservationModel().getEntryRelationship(immunization.getPrevention().getNextDate()); - } - - public EntryRelationship getComment() { - return comment; - } - - private void setComment() { - this.comment = new CommentObservationModel().getEntryRelationship(immunization.getPreventionMap().get(Constants.PreventionExtKeys.comments.toString()), immunization.getPrevention().getCreationDate(), immunization.getPrevention().getProviderNo()); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/LabsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/LabsModel.java deleted file mode 100644 index 0e47c9bed5..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/LabsModel.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; -import java.util.List; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.oscarehr.common.model.Hl7TextInfo; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Lab; -import org.oscarehr.e2e.model.PatientExport.LabComponent; -import org.oscarehr.e2e.model.PatientExport.LabOrganizer; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.model.export.template.ResultOrganizerModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class LabsModel { - private Lab lab; - private Hl7TextInfo hl7TextInfo; - - private SET ids; - private CD code; - private ED text; - private ArrayList authors; - private ArrayList resultOrganizers; - - public LabsModel(Lab lab) { - if(lab == null) { - this.lab = new Lab(new Hl7TextInfo()); - } else { - this.lab = lab; - } - this.hl7TextInfo = this.lab.getHl7TextInfo(); - - setIds(); - setCode(); - setText(); - setAuthor(); - setResultOrganizers(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(hl7TextInfo.getDiscipline())) { - sb.append("Discipline: ".concat(hl7TextInfo.getDiscipline())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(hl7TextInfo.getObrDate())) { - sb.append("\nOBR: ".concat(hl7TextInfo.getObrDate())); - } - for(LabOrganizer labOrganizer : lab.getLabOrganizer()) { - for(LabComponent labComponent : labOrganizer.getLabComponent()) { - if(!EverestUtils.isNullorEmptyorWhitespace(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.name.toString()))) { - sb.append("\n".concat(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.name.toString()))); - } - if(!EverestUtils.isNullorEmptyorWhitespace(labComponent.getMeasurement().getDataField())) { - sb.append(": ".concat(labComponent.getMeasurement().getDataField())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.unit.toString()))) { - sb.append(" ".concat(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.unit.toString()))); - } - } - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Lab, hl7TextInfo.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(); - this.code.setNullFlavor(NullFlavor.NoInformation); - } - - public ED getText() { - return text; - } - - private void setText() { - if(!EverestUtils.isNullorEmptyorWhitespace(hl7TextInfo.getDiscipline())) { - this.text = new ED(lab.getHl7TextInfo().getDiscipline()); - } else { - this.text = null; - } - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - this.authors = new ArrayList(); - this.authors.add(new AuthorParticipationModel().getAuthor(EverestUtils.stringToDate(lab.getRequestDate()), hl7TextInfo.getRequestingProvider())); - } - - public ArrayList getResultOrganizers() { - return resultOrganizers; - } - - private void setResultOrganizers() { - this.resultOrganizers = new ArrayList(); - - List labOrganizers = lab.getLabOrganizer(); - if(labOrganizers.isEmpty()) { - this.resultOrganizers.add(new ResultOrganizerModel().getEntryRelationship(null)); - } else { - for(LabOrganizer labOrganizer : labOrganizers) { - this.resultOrganizers.add(new ResultOrganizerModel().getEntryRelationship(labOrganizer)); - } - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java deleted file mode 100644 index 34707100c9..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.Calendar; -import java.util.Date; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.BodyConstants; -import org.oscarehr.e2e.constant.BodyConstants.Medications; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.ConsumableModel; -import org.oscarehr.e2e.model.export.template.MedicationPrescriptionEventModel; -import org.oscarehr.e2e.model.export.template.observation.DateObservationModel; -import org.oscarehr.e2e.model.export.template.observation.UnboundObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class MedicationsModel { - private Drug drug; - - private SET ids; - private CD code; - private ActStatus statusCode; - private Consumable consumable; - private EntryRelationship recordType; - private EntryRelationship lastReviewDate; - private EntryRelationship prescriptionInformation; - - public MedicationsModel(Drug drug) { - if(drug == null) { - this.drug = new Drug(); - } else { - this.drug = drug; - } - - setIds(); - setCode(); - setStatusCode(); - setConsumable(); - setRecordType(); - setLastReviewDate(); - setPrescriptionInformation(); - } - - private Boolean isActiveDrug(Date date) { - try { - // Add a day to date to mark drugs ending "today" as still active - Calendar c = Calendar.getInstance(); - c.setTime(date); - c.add(Calendar.DATE, 1); - - if(new Date().before(c.getTime())) { - return true; - } - } catch (NullPointerException e) { - return false; - } - return false; - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getGenericName())) { - sb.append(drug.getGenericName()); - } else { - sb.append(drug.getBrandName()); - } - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDosage())) { - sb.append(" " + drug.getDosage()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getFreqCode())) { - sb.append(" " + drug.getFreqCode()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDuration())) { - sb.append(" " + drug.getDuration()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDurUnit())) { - sb.append(" " + drug.getDurUnit()); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Medications, drug.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(Constants.SubstanceAdministrationType.DRUG.toString(), Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - this.code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - this.code.setDisplayName(BodyConstants.Medications.DRUG_THERAPY_ACT_NAME); - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(!drug.isArchived() && drug.getLongTerm() || isActiveDrug(drug.getEndDate())) { - this.statusCode = ActStatus.Active; - } else { - this.statusCode = ActStatus.Completed; - } - } - - public Consumable getConsumable() { - return consumable; - } - - private void setConsumable() { - this.consumable = new ConsumableModel().getConsumable(drug); - } - - public EntryRelationship getRecordType() { - return recordType; - } - - private void setRecordType() { - String value; - if(drug.getLongTerm()) { - value = Medications.LONG_TERM; - } else { - value = Medications.SHORT_TERM; - } - this.recordType = new UnboundObservationModel().getEntryRelationship(value); - } - - public EntryRelationship getLastReviewDate() { - return lastReviewDate; - } - - private void setLastReviewDate() { - this.lastReviewDate = new DateObservationModel().getEntryRelationship(drug.getLastUpdateDate()); - } - - public EntryRelationship getPrescriptionInformation() { - return prescriptionInformation; - } - - private void setPrescriptionInformation() { - this.prescriptionInformation = new MedicationPrescriptionEventModel().getEntryRelationship(drug); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/ProblemsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/ProblemsModel.java deleted file mode 100644 index 953d2e231f..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/ProblemsModel.java +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.oscarehr.common.model.Dxresearch; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.model.export.template.observation.DateObservationModel; -import org.oscarehr.e2e.model.export.template.observation.SecondaryCodeICD9ObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ProblemsModel { - private Dxresearch problem; - - private SET ids; - private CD code; - private ED text; - private ActStatus statusCode; - private IVL effectiveTime; - private CD value; - private ArrayList authors; - private EntryRelationship secondaryCodeICD9; - private EntryRelationship diagnosisDate; - - public ProblemsModel(Dxresearch problem) { - if(problem == null) { - this.problem = new Dxresearch(); - } else { - this.problem = problem; - } - - setIds(); - setCode(); - setText(); - setStatusCode(); - setEffectiveTime(); - setValue(); - setAuthor(); - setSecondaryCodeICD9(); - setDiagnosisDate(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - String description = EverestUtils.getICD9Description(problem.getDxresearchCode()); - - if(!EverestUtils.isNullorEmptyorWhitespace(problem.getDxresearchCode())) { - sb.append("ICD9: " + problem.getDxresearchCode()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(description)) { - sb.append(" - " + description); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.ProblemList, problem.getDxresearchNo()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(); - this.code.setNullFlavor(NullFlavor.NoInformation); - } - - public ED getText() { - return text; - } - - private void setText() { - String description = EverestUtils.getICD9Description(problem.getDxresearchCode()); - if(!EverestUtils.isNullorEmptyorWhitespace(description)) { - this.text = new ED(description); - } else { - this.text = null; - } - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(problem.getStatus() != null && problem.getStatus().equals('A')) { - this.statusCode = ActStatus.Active; - } else { - this.statusCode = ActStatus.Completed; - } - } - - public IVL getEffectiveTime() { - return effectiveTime; - } - - private void setEffectiveTime() { - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(problem.getStartDate()); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - this.effectiveTime = ivl; - } - - public CD getValue() { - return value; - } - - private void setValue() { - this.value = new CD(); - this.value.setNullFlavor(NullFlavor.Unknown); - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - authors = new ArrayList(); - authors.add(new AuthorParticipationModel(problem.getProviderNo()).getAuthor(problem.getUpdateDate())); - } - - public EntryRelationship getSecondaryCodeICD9() { - return secondaryCodeICD9; - } - - private void setSecondaryCodeICD9() { - this.secondaryCodeICD9 = new SecondaryCodeICD9ObservationModel().getEntryRelationship(problem.getDxresearchCode()); - } - - public EntryRelationship getDiagnosisDate() { - return diagnosisDate; - } - - private void setDiagnosisDate() { - this.diagnosisDate = new DateObservationModel().getEntryRelationship(problem.getUpdateDate()); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/RiskFactorsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/RiskFactorsModel.java deleted file mode 100644 index 92cb136bec..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/RiskFactorsModel.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class RiskFactorsModel { - private CaseManagementNote riskFactor; - - private SET ids; - private CD code; - private ActStatus statusCode; - private ArrayList authors; - private ArrayList components; - - public RiskFactorsModel(CaseManagementNote riskFactor) { - if(riskFactor == null) { - this.riskFactor = new CaseManagementNote(); - } else { - this.riskFactor = riskFactor; - } - - setIds(); - setCode(); - setStatusCode(); - setAuthor(); - setComponentObservation(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(riskFactor.getObservation_date() != null) { - sb.append(riskFactor.getObservation_date()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(riskFactor.getNote())) { - sb.append(" ".concat(riskFactor.getNote().replaceAll("\\\\n", "\n"))); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.RiskFactors, riskFactor.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - CD code = new CD("40514009", Constants.CodeSystems.SNOMED_CT_OID); - code.setCodeSystemName(Constants.CodeSystems.SNOMED_CT_NAME); - this.code = code; - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(!riskFactor.isArchived()) { - this.statusCode = ActStatus.Active; - } else { - this.statusCode = ActStatus.Completed; - } - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - this.authors = new ArrayList(); - this.authors.add(new AuthorParticipationModel(riskFactor.getProviderNo()).getAuthor(riskFactor.getUpdate_date())); - } - - public ArrayList getComponentObservation() { - return components; - } - - private void setComponentObservation() { - Component4 component = new Component4(ActRelationshipHasComponent.HasComponent, new BL(true)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(getIds()); - observation.setCode(getObservationCode()); - observation.setText(getObservationName()); - observation.setEffectiveTime(getObservationDate()); - observation.setValue(getObservationValue()); - - component.setClinicalStatement(observation); - this.components = new ArrayList(Arrays.asList(component)); - } - - protected CD getObservationCode() { - CD code = new CD(); - code.setNullFlavor(NullFlavor.NoInformation); - return code; - } - - protected ED getObservationName() { - ED text = null; - if(!EverestUtils.isNullorEmptyorWhitespace(riskFactor.getNote())) { - text = new ED(riskFactor.getNote()); - } - - return text; - } - - protected IVL getObservationDate() { - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(riskFactor.getObservation_date()); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - return ivl; - } - - protected ST getObservationValue() { - ST value = new ST(); - if(!EverestUtils.isNullorEmptyorWhitespace(riskFactor.getNote())) { - value.setValue(riskFactor.getNote()); - } else { - value.setNullFlavor(NullFlavor.NoInformation); - } - - return value; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/header/AuthorModel.java b/src/main/java/org/oscarehr/e2e/model/export/header/AuthorModel.java deleted file mode 100644 index 9fbcd2eedc..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/header/AuthorModel.java +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.SC; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TelecommunicationsAddressUse; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AuthoringDevice; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Person; -import org.oscarehr.common.model.ProviderData; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Constants.TelecomType; -import org.oscarehr.e2e.util.EverestUtils; - -public class AuthorModel { - private final ProviderData provider; - - protected SET ids; - private SET telecoms; - protected Person person; - private SET deviceIds; - private AuthoringDevice device; - - protected AuthorModel(String providerNo) { - ProviderData provider = EverestUtils.getProviderFromString(providerNo); - if(provider == null) { - this.provider = new ProviderData(); - } else { - this.provider = provider; - } - - constructorHelper(); - } - - public AuthorModel(ProviderData provider) { - if(provider == null) { - this.provider = new ProviderData(); - } else { - this.provider = provider; - } - - constructorHelper(); - } - - private void constructorHelper() { - setIds(); - setTelecoms(); - setPerson(); - setDeviceIds(); - setDevice(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - II id = new II(); - if(!EverestUtils.isNullorEmptyorWhitespace(provider.getPractitionerNo())) { - id.setRoot(Constants.DocumentHeader.BC_MINISTRY_OF_HEALTH_PRACTITIONER_ID_OID); - id.setAssigningAuthorityName(Constants.DocumentHeader.BC_MINISTRY_OF_HEALTH_PRACTITIONER_NAME); - id.setExtension(provider.getPractitionerNo()); - } else if (!EverestUtils.isNullorEmptyorWhitespace(provider.getOhipNo())) { - id.setRoot(Constants.DocumentHeader.MEDICAL_SERVICES_PLAN_BILLING_NUMBER_OID); - id.setAssigningAuthorityName(Constants.DocumentHeader.MEDICAL_SERVICES_PLAN_BILLING_NUMBER_NAME); - id.setExtension(provider.getOhipNo()); - } else if (provider.getId() != null) { - id.setRoot(Constants.DocumentHeader.LOCALLY_ASSIGNED_IDENTIFIER_OID); - id.setAssigningAuthorityName(Constants.DocumentHeader.LOCALLY_ASSIGNED_IDENTIFIER_NAME); - id.setExtension(provider.getId()); - } else { - id.setNullFlavor(NullFlavor.NoInformation); - } - this.ids = new SET(id); - } - - public SET getTelecoms() { - return telecoms; - } - - private void setTelecoms() { - SET telecoms = new SET(); - EverestUtils.addTelecomPart(telecoms, provider.getPhone(), TelecommunicationsAddressUse.Home, TelecomType.TELEPHONE); - EverestUtils.addTelecomPart(telecoms, provider.getWorkPhone(), TelecommunicationsAddressUse.WorkPlace, TelecomType.TELEPHONE); - EverestUtils.addTelecomPart(telecoms, provider.getEmail(), TelecommunicationsAddressUse.Home, TelecomType.EMAIL); - if(!telecoms.isEmpty()) { - this.telecoms = telecoms; - } else { - this.telecoms = null; - } - } - - public Person getPerson() { - return person; - } - - private void setPerson() { - Person person = new Person(); - SET names = new SET(); - EverestUtils.addNamePart(names, provider.getFirstName(), provider.getLastName(), EntityNameUse.OfficialRecord); - if(names.isEmpty()) { - PN pn = new PN(); - pn.setNullFlavor(NullFlavor.NoInformation); - names.add(pn); - } - person.setName(names); - this.person = person; - } - - public SET getDeviceIds() { - return deviceIds; - } - - private void setDeviceIds() { - II id = new II(); - id.setNullFlavor(NullFlavor.NoInformation); - this.deviceIds = new SET(id); - } - - public AuthoringDevice getDevice() { - return device; - } - - private void setDevice() { - AuthoringDevice device = new AuthoringDevice(); - device.setSoftwareName(new SC(Constants.EMR.EMR_VERSION)); - this.device = device; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/header/CustodianModel.java b/src/main/java/org/oscarehr/e2e/model/export/header/CustodianModel.java deleted file mode 100644 index 49272e8a98..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/header/CustodianModel.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import java.util.ArrayList; - -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ON; -import org.marc.everest.datatypes.generic.SET; -import org.oscarehr.common.model.Clinic; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class CustodianModel { - private final Clinic clinic; - - private SET ids; - private ON name; - - public CustodianModel(Clinic clinic) { - if(clinic == null) { - this.clinic = new Clinic(); - } else { - this.clinic = clinic; - } - - setIds(); - setName(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - II id = new II(); - if(clinic.getId() != null && !EverestUtils.isNullorEmptyorWhitespace(clinic.getId().toString())) { - id.setRoot(Constants.EMR.EMR_OID); - id.setAssigningAuthorityName(Constants.EMR.EMR_VERSION); - id.setExtension(clinic.getId().toString()); - } else { - id.setNullFlavor(NullFlavor.NoInformation); - } - this.ids = new SET(id); - } - - public ON getName() { - return name; - } - - private void setName() { - ArrayList name = new ArrayList(); - if(!EverestUtils.isNullorEmptyorWhitespace(clinic.getClinicName())) { - name.add(new ENXP(clinic.getClinicName())); - } - if(!name.isEmpty()) { - ON on = new ON(); - on.setParts(name); - this.name = on; - } - else { - this.name = null; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/header/RecordTargetModel.java b/src/main/java/org/oscarehr/e2e/model/export/header/RecordTargetModel.java deleted file mode 100644 index 2eb42f1a44..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/header/RecordTargetModel.java +++ /dev/null @@ -1,225 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; - -import org.marc.everest.datatypes.AD; -import org.marc.everest.datatypes.ADXP; -import org.marc.everest.datatypes.AddressPartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.PostalAddressUse; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.TelecommunicationsAddressUse; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.LanguageCommunication; -import org.marc.everest.rmim.uv.cdar2.vocabulary.AdministrativeGender; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.constant.Constants.TelecomType; -import org.oscarehr.e2e.util.EverestUtils; - -public class RecordTargetModel { - private Demographic demographic; - - private SET ids; - private SET addresses; - private SET telecoms; - private SET names; - private CE gender; - private TS birthDate; - private ArrayList languages; - - public RecordTargetModel(Demographic demographic) { - if(demographic == null) { - this.demographic = new Demographic(); - } else { - this.demographic = demographic; - } - - setIds(); - setAddresses(); - setTelecoms(); - setNames(); - setGender(); - setBirthDate(); - setLanguages(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - II id = new II(); - if(!EverestUtils.isNullorEmptyorWhitespace(demographic.getHin())) { - id.setRoot(Constants.DocumentHeader.BC_PHN_OID); - id.setAssigningAuthorityName(Constants.DocumentHeader.BC_PHN_OID_ASSIGNING_AUTHORITY_NAME); - id.setExtension(demographic.getHin()); - } else { - id.setNullFlavor(NullFlavor.NoInformation); - } - this.ids = new SET(id); - } - - public SET getAddresses() { - return addresses; - } - - private void setAddresses() { - ArrayList addrParts = new ArrayList(); - EverestUtils.addAddressPart(addrParts, demographic.getAddress(), AddressPartType.Delimiter); - EverestUtils.addAddressPart(addrParts, demographic.getCity(), AddressPartType.City); - EverestUtils.addAddressPart(addrParts, demographic.getProvince(), AddressPartType.State); - EverestUtils.addAddressPart(addrParts, demographic.getPostal(), AddressPartType.PostalCode); - if(!addrParts.isEmpty()) { - CS use = new CS(PostalAddressUse.HomeAddress); - AD addr = new AD(use, addrParts); - this.addresses = new SET(addr); - } - else { - this.addresses = null; - } - } - - public SET getTelecoms() { - return telecoms; - } - - private void setTelecoms() { - SET telecoms = new SET(); - EverestUtils.addTelecomPart(telecoms, demographic.getPhone(), TelecommunicationsAddressUse.Home, TelecomType.TELEPHONE); - EverestUtils.addTelecomPart(telecoms, demographic.getPhone2(), TelecommunicationsAddressUse.WorkPlace, TelecomType.TELEPHONE); - EverestUtils.addTelecomPart(telecoms, demographic.getEmail(), TelecommunicationsAddressUse.Home, TelecomType.EMAIL); - if(!telecoms.isEmpty()) { - this.telecoms = telecoms; - } - else { - this.telecoms = null; - } - } - - public SET getNames() { - return names; - } - - private void setNames() { - SET names = new SET(); - EverestUtils.addNamePart(names, demographic.getFirstName(), demographic.getLastName(), EntityNameUse.Legal); - if(!names.isEmpty()) { - this.names = names; - } - else { - this.names = null; - } - } - - public CE getGender() { - return gender; - } - - private void setGender() { - CE gender = new CE(); - if(EverestUtils.isNullorEmptyorWhitespace(demographic.getSex())) { - gender.setNullFlavor(NullFlavor.NoInformation); - } - else { - String sexCode = demographic.getSex().toUpperCase().replace("U", "UN"); - if(Mappings.genderCode.containsKey(sexCode)) { - gender.setCodeEx(Mappings.genderCode.get(sexCode)); - gender.setDisplayName(Mappings.genderDescription.get(sexCode)); - } - else { - gender.setNullFlavor(NullFlavor.NoInformation); - } - } - this.gender = gender; - } - - public TS getBirthDate() { - return birthDate; - } - - private void setBirthDate() { - TS birthDate = new TS(); - - if(demographic.getYearOfBirth() != null && demographic.getMonthOfBirth() != null) { - try { - if(Integer.parseInt(demographic.getYearOfBirth()) >= 0 && - Integer.parseInt(demographic.getMonthOfBirth()) >= 1 && - Integer.parseInt(demographic.getMonthOfBirth()) <= 12) { - Calendar cal = Calendar.getInstance(); - - if(demographic.getDateOfBirth() != null && - Integer.parseInt(demographic.getDateOfBirth()) >= 1 && - Integer.parseInt(demographic.getDateOfBirth()) <= 31) { - String dob = demographic.getYearOfBirth() + demographic.getMonthOfBirth() + demographic.getDateOfBirth(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); - cal.setTime(sdf.parse(dob)); - birthDate.setDateValuePrecision(TS.DAY); - } else { - String mob = demographic.getYearOfBirth() + demographic.getMonthOfBirth(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); - cal.setTime(sdf.parse(mob)); - birthDate.setDateValuePrecision(TS.MONTH); - } - - birthDate.setDateValue(cal); - } else { - throw new NumberFormatException(); - } - } catch (Exception e) { - birthDate.setNullFlavor(NullFlavor.Other); - } - } else { - birthDate.setNullFlavor(NullFlavor.NoInformation); - } - - this.birthDate = birthDate; - } - - public ArrayList getLanguages() { - return languages; - } - - private void setLanguages() { - ArrayList languages = new ArrayList(); - EverestUtils.addLanguagePart(languages, demographic.getOfficialLanguage()); - if(!languages.isEmpty()) { - this.languages = languages; - } - else { - this.languages = null; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModel.java deleted file mode 100644 index a92b1db201..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModel.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedAuthor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Person; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.oscarehr.common.model.ProviderData; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.header.AuthorModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class AuthorParticipationModel extends AuthorModel { - public AuthorParticipationModel() { - super(new ProviderData()); - } - - public AuthorParticipationModel(String providerNo) { - super(providerNo); - } - - public Author getAuthor(Date date, String authorName) { - this.person = new Person(); - SET names = new SET(); - PN pn = null; - - if(!EverestUtils.isNullorEmptyorWhitespace(authorName)) { - pn = new PN(EntityNameUse.OfficialRecord, Arrays.asList(new ENXP(authorName))); - } else { - pn = new PN(); - pn.setNullFlavor(NullFlavor.NoInformation); - } - names.add(pn); - person.setName(names); - - return getAuthor(date); - } - - public Author getAuthor(Date date) { - TS time = EverestUtils.buildTSFromDate(date); - if(time == null) { - time = new TS(); - time.setNullFlavor(NullFlavor.Unknown); - } - - Author author = new Author(); - AssignedAuthor assignedAuthor = new AssignedAuthor(); - - author.setContextControlCode(ContextControl.OverridingPropagating); - author.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.AUTHOR_PARTICIPATION_TEMPLATE_ID))); - author.setTime(time); - author.setAssignedAuthor(assignedAuthor); - - assignedAuthor.setId(ids); - assignedAuthor.setAssignedAuthorChoice(person); - - return author; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/ConsumableModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/ConsumableModel.java deleted file mode 100644 index 54813fb467..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/ConsumableModel.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.util.Arrays; - -import org.marc.everest.datatypes.EN; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.LabeledDrug; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ManufacturedProduct; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Material; -import org.marc.everest.rmim.uv.cdar2.vocabulary.DrugEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityDeterminerDetermined; -import org.marc.everest.rmim.uv.cdar2.vocabulary.RoleClassManufacturedProduct; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Immunization; -import org.oscarehr.e2e.util.EverestUtils; - -public class ConsumableModel { - private Consumable consumable; - - public ConsumableModel() { - consumable = new Consumable(); - consumable.setManufacturedProduct(new ManufacturedProduct()); - } - - public Consumable getConsumable(Immunization immunization) { - if(immunization == null) { - immunization = new Immunization(null, null); - } - - ManufacturedProduct manufacturedProduct = consumable.getManufacturedProduct(); - manufacturedProduct.setClassCode(RoleClassManufacturedProduct.ManufacturedProduct); - - Material material = new Material(); - material.setDeterminerCode(EntityDeterminerDetermined.Described); - material.setCode(getImmunizationCode(immunization)); - material.setName(getImmunizationName(immunization)); - material.setLotNumberText(getImmunizationLotNumber(immunization)); - - manufacturedProduct.setManufacturedDrugOrOtherMaterial(material); - - return consumable; - } - - private CE getImmunizationCode(Immunization immunization) { - CE code = new CE(); - - if(!EverestUtils.isNullorEmptyorWhitespace(EverestUtils.getPreventionType(immunization.getPrevention().getPreventionType()))) { - code.setCode(EverestUtils.getPreventionType(immunization.getPrevention().getPreventionType())); - code.setCodeSystem(Constants.CodeSystems.ATC_OID); - code.setCodeSystemName(Constants.CodeSystems.ATC_NAME); - } else { - code.setNullFlavor(NullFlavor.NoInformation); - } - - return code; - } - - private EN getImmunizationName(Immunization immunization) { - EN name = new EN(); - - if(!EverestUtils.isNullorEmptyorWhitespace(immunization.getPrevention().getPreventionType())) { - name.setParts(Arrays.asList(new ENXP(immunization.getPrevention().getPreventionType()))); - } else { - name.setNullFlavor(NullFlavor.NoInformation); - } - - return name; - } - - private ST getImmunizationLotNumber(Immunization immunization) { - ST lot = null; - if(!EverestUtils.isNullorEmptyorWhitespace(immunization.getPreventionMap().get(Constants.PreventionExtKeys.lot.toString()))) { - lot = new ST(immunization.getPreventionMap().get(Constants.PreventionExtKeys.lot.toString())); - } - return lot; - } - - // TODO [MARC-HI] Add e2e namespace extension fields - public Consumable getConsumable(Drug drug) { - if(drug == null) { - drug = new Drug(); - } - - consumable.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.MEDICATION_IDENTIFICATION_TEMPLATE_ID))); - - ManufacturedProduct manufacturedProduct = consumable.getManufacturedProduct(); - manufacturedProduct.setClassCode(RoleClassManufacturedProduct.ManufacturedProduct); - - LabeledDrug labeledDrug = new LabeledDrug(); - labeledDrug.setDeterminerCode(EntityDeterminerDetermined.Described); - labeledDrug.setCode(getDrugCode(drug)); - labeledDrug.setName(getDrugName(drug)); - - manufacturedProduct.setManufacturedDrugOrOtherMaterial(labeledDrug); - - return consumable; - } - - private CE getDrugCode(Drug drug) { - CE code = new CE(); - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getRegionalIdentifier())) { - code.setCodeEx(new DrugEntity(drug.getRegionalIdentifier().trim(), Constants.CodeSystems.DIN_OID)); - code.setCodeSystemName(Constants.CodeSystems.DIN_NAME); - } else if(!EverestUtils.isNullorEmptyorWhitespace(drug.getAtc())) { - code.setCodeEx(new DrugEntity(drug.getAtc().trim(), Constants.CodeSystems.ATC_OID)); - code.setCodeSystemName(Constants.CodeSystems.ATC_NAME); - } else { - code.setNullFlavor(NullFlavor.NoInformation); - } - - return code; - } - - private EN getDrugName(Drug drug) { - EN name = new EN(); - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getGenericName())) { - name.setParts(Arrays.asList(new ENXP(drug.getGenericName()))); - } else if(!EverestUtils.isNullorEmptyorWhitespace(drug.getBrandName())) { - name.setParts(Arrays.asList(new ENXP(drug.getBrandName()))); - } else { - name.setNullFlavor(NullFlavor.NoInformation); - } - - return name; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModel.java deleted file mode 100644 index 9b7dfa91b1..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModel.java +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.SetOperator; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.datatypes.interfaces.ISetComponent; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.DoseObservationModel; -import org.oscarehr.e2e.model.export.template.observation.InstructionObservationModel; -import org.oscarehr.e2e.model.export.template.observation.OrderIndicatorObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class MedicationPrescriptionEventModel { - private Drug drug; - - public EntryRelationship getEntryRelationship(Drug drug) { - if(drug == null) { - this.drug = new Drug(); - } else { - this.drug = drug; - } - - EntryRelationship entryRelationship = new EntryRelationship(); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.RQO, getConsumable()); - ArrayList entryRelationships = new ArrayList(); - - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.MEDICATION_PRESCRIPTION_EVENT_TEMPLATE_ID))); - - substanceAdministration.setId(getIds()); - substanceAdministration.setCode(getCode()); - substanceAdministration.setEffectiveTime(getEffectiveTime()); - substanceAdministration.setAuthor(getAuthor()); - - entryRelationships.add(getDoseInstructions()); - entryRelationships.add(getPRN()); - entryRelationships.add(getInstructionsToPatient()); - - substanceAdministration.setEntryRelationship(entryRelationships); - - entryRelationship.setClinicalStatement(substanceAdministration); - - return entryRelationship; - } - - private SET getIds() { - return EverestUtils.buildUniqueId(Constants.IdPrefixes.MedicationPrescriptions, drug.getId()); - } - - private CD getCode() { - CD code = new CD(Constants.SubstanceAdministrationType.DRUG.toString(), Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - return code; - } - - private ArrayList> getEffectiveTime() { - TS startTime = EverestUtils.buildTSFromDate(drug.getRxDate()); - TS endTime = EverestUtils.buildTSFromDate(drug.getEndDate()); - - IVL ivl = new IVL(); - ivl.setOperator(SetOperator.Inclusive); - if(startTime == null) { - startTime = new TS(); - startTime.setNullFlavor(NullFlavor.Unknown); - ivl.setLow(startTime); - } else { - ivl.setLow(startTime); - ivl.setHigh(endTime); - } - - ArrayList> effectiveTime = new ArrayList>(); - effectiveTime.add(ivl); - - return effectiveTime; - } - - private Consumable getConsumable() { - return new ConsumableModel().getConsumable(drug); - } - - private ArrayList getAuthor() { - ArrayList authors = new ArrayList(); - authors.add(new AuthorParticipationModel(drug.getProviderNo()).getAuthor(drug.getWrittenDate())); - return authors; - } - - private EntryRelationship getDoseInstructions() { - return new DoseObservationModel().getEntryRelationship(drug); - } - - private EntryRelationship getPRN() { - return new OrderIndicatorObservationModel().getEntryRelationship(drug.isPrn()); - } - - private EntryRelationship getInstructionsToPatient() { - return new InstructionObservationModel().getEntryRelationship(drug.getSpecialInstruction()); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModel.java deleted file mode 100644 index 5456178b22..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModel.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.util.Arrays; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.header.AuthorModel; - -public class ProviderParticipationModel extends AuthorModel { - public ProviderParticipationModel(String providerNo) { - super(providerNo); - } - - public Participant2 getProvider() { - Participant2 participant = new Participant2(ParticipationType.PrimaryPerformer, ContextControl.OverridingPropagating); - ParticipantRole participantRole = new ParticipantRole(new CD(Constants.RoleClass.PROV.toString())); - PlayingEntity playingEntity = new PlayingEntity(EntityClassRoot.Person); - - playingEntity.setName(person.getName()); - playingEntity.setDesc(new ED("Provider")); - - participantRole.setPlayingEntityChoice(playingEntity); - participantRole.setId(ids); - - participant.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.PROVIDER_PARTICIPATION_TEMPLATE_ID))); - participant.setParticipantRole(participantRole); - - return participant; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/ResultComponentModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/ResultComponentModel.java deleted file mode 100644 index 4e482a5162..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/ResultComponentModel.java +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ON; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedEntity; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ObservationRange; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organization; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Performer2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Procedure; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ReferenceRange; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ObservationInterpretation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentProcedureMood; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.BodyConstants.Labs; -import org.oscarehr.e2e.model.PatientExport.LabComponent; -import org.oscarehr.e2e.model.export.template.observation.CommentObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ResultComponentModel { - private LabComponent labComponent; - - public Component4 getComponent(LabComponent labComponent) { - if(labComponent == null) { - this.labComponent = new LabComponent(null, null); - } else { - this.labComponent = labComponent; - } - - Component4 component = new Component4(ActRelationshipHasComponent.HasComponent, new BL(true)); - component.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.RESULT_COMPONENT_TEMPLATE_ID))); - ArrayList entryRelationships = new ArrayList(); - - Observation observation = new Observation(); - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.setId(getIds()); - observation.setCode(getCode()); - observation.setText(getText()); - observation.setStatusCode(getStatusCode()); - observation.setEffectiveTime(getTime()); - observation.setValue(getValue()); - observation.setInterpretationCode(getInterpretationCode()); - observation.setPerformer(getPerformer()); - observation.setReferenceRange(getReferenceRange()); - - entryRelationships.add(getSpecimenCollection()); - entryRelationships.add(getResultNotes()); - - observation.setEntryRelationship(entryRelationships); - component.setClinicalStatement(observation); - return component; - } - - private SET getIds() { - String accession = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.accession.toString()); - II ii = new II(); - if(EverestUtils.isNullorEmptyorWhitespace(accession)) { - ii.setNullFlavor(NullFlavor.NoInformation); - } else { - ii.setRoot(Constants.EMR.EMR_OID); - ii.setExtension(accession); - } - - return new SET(ii); - } - - private CD getCode() { - String identifier = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.identifier.toString()); - CD code = new CD(); - if(EverestUtils.isNullorEmptyorWhitespace(identifier)) { - code.setNullFlavor(NullFlavor.NoInformation); - } else { - code.setCodeEx(identifier); - code.setCodeSystem(Constants.CodeSystems.PCLOCD_OID); - code.setCodeSystemName(Constants.CodeSystems.PCLOCD_NAME); - } - - return code; - } - - private ED getText() { - String name = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.name.toString()); - if(!EverestUtils.isNullorEmptyorWhitespace(name)) { - return new ED(name); - } - - return null; - } - - private CS getStatusCode() { - String olis_status = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.olis_status.toString()); - CS actStatus = new CS(); - if(EverestUtils.isNullorEmptyorWhitespace(olis_status)) { - actStatus.setNullFlavor(NullFlavor.NoInformation); - } else if(olis_status.equalsIgnoreCase("P")) { - actStatus.setCodeEx(ActStatus.Active); - } else { - actStatus.setCodeEx(ActStatus.Completed); - } - - return actStatus; - } - - private IVL getTime() { - String datetime = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.datetime.toString()); - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(EverestUtils.stringToDate(datetime), TS.SECONDNOTIMEZONE); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - return ivl; - } - - private ANY getValue() { - String dataField = labComponent.getMeasurement().getDataField(); - String unit = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.unit.toString()); - ANY value = null; - if(!EverestUtils.isNullorEmptyorWhitespace(dataField)) { - if(!EverestUtils.isNullorEmptyorWhitespace(unit)) { - try { - value = new PQ(new BigDecimal(dataField), unit.replaceAll("\\s","_")); - } catch (NumberFormatException e) { - value = new ST(dataField.concat(" ").concat(unit)); - } - } else { - value = new ST(dataField); - } - } - - return value; - } - - private SET> getInterpretationCode() { - String abnormal = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.abnormal.toString()); - SET> interpretationCodes = null; - if(!EverestUtils.isNullorEmptyorWhitespace(abnormal)) { - CE interpretation = new CE(); - if(abnormal.equalsIgnoreCase(Labs.ABNORMAL_CODE)) { - interpretation.setCodeEx(ObservationInterpretation.Abnormal); - interpretation.setDisplayName(Labs.ABNORMAL); - } else { - interpretation.setCodeEx(ObservationInterpretation.Normal); - interpretation.setDisplayName(Labs.NORMAL); - } - interpretationCodes = new SET>(interpretation); - } - - return interpretationCodes; - } - - private ArrayList getPerformer() { - String labname = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.labname.toString()); - ArrayList performers = null; - if(!EverestUtils.isNullorEmptyorWhitespace(labname)) { - Performer2 performer = new Performer2(); - AssignedEntity assignedEntity = new AssignedEntity(); - Organization organization = new Organization(); - - II ii = new II(); - ii.setNullFlavor(NullFlavor.NoInformation); - ON on = new ON(EntityNameUse.OfficialRecord, Arrays.asList(new ENXP(labname))); - organization.setName(new SET(on)); - - assignedEntity.setId(new SET(ii)); - assignedEntity.setRepresentedOrganization(organization); - - performer.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.PERFORMER_PARTICIPATION_TEMPLATE_ID))); - performer.setTime(getTime()); - performer.setAssignedEntity(assignedEntity); - performers = new ArrayList(Arrays.asList(performer)); - } - - return performers; - } - - private EntryRelationship getSpecimenCollection() { - String datetime = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.datetime.toString()); - EntryRelationship entryRelationship = null; - if(!EverestUtils.isNullorEmptyorWhitespace(datetime)) { - Procedure procedure = new Procedure(x_DocumentProcedureMood.Eventoccurrence); - procedure.setEffectiveTime(getTime()); - - entryRelationship = new EntryRelationship(); - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setClinicalStatement(procedure); - } - return entryRelationship; - } - - private EntryRelationship getResultNotes() { - String comments = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.comments.toString()); - Date date = labComponent.getMeasurement().getDateObserved(); - EntryRelationship entryRelationship = null; - if(!EverestUtils.isNullorEmptyorWhitespace(comments)) { - entryRelationship = new CommentObservationModel().getEntryRelationship(comments, date, null); - } - return entryRelationship; - } - - private ArrayList getReferenceRange() { - String range = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.range.toString()); - String minimum = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.minimum.toString()); - String maximum = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.maximum.toString()); - String unit = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.unit.toString()); - - ObservationRange observationRange = new ObservationRange(); - ReferenceRange referenceRange = new ReferenceRange(observationRange); - CD code = new CD(Labs.NORMAL_CODE, Constants.CodeSystems.OBSERVATION_INTERPRETATION_OID); - code.setCodeSystemName(Constants.CodeSystems.OBSERVATION_INTERPRETATION_NAME); - code.setDisplayName(Labs.NORMAL); - observationRange.setCode(code); - - String unitField = ""; - if(!EverestUtils.isNullorEmptyorWhitespace(unit)) { - unitField = " ".concat(unit); - } - - if(!EverestUtils.isNullorEmptyorWhitespace(range)) { - observationRange.setText(new ED(range.concat(unitField))); - observationRange.setValue(new ST(range.concat(unitField))); - } else if (!EverestUtils.isNullorEmptyorWhitespace(minimum) || !EverestUtils.isNullorEmptyorWhitespace(maximum)) { - if(EverestUtils.isNullorEmptyorWhitespace(minimum)) { - observationRange.setText(new ED("Reference range is less than ".concat(maximum).concat(unitField))); - } else if(EverestUtils.isNullorEmptyorWhitespace(maximum)) { - observationRange.setText(new ED("Reference range is greater than ".concat(minimum).concat(unitField))); - } else { - observationRange.setText(new ED("Reference range is between ".concat(minimum).concat(" and ").concat(maximum).concat(unitField))); - } - - // Either we get a complete, properly formatted PQ value with units, or we don't include it at all - PQ low, high; - try { - low = new PQ(new BigDecimal(minimum), unit.replaceAll("\\s","_")); - } catch (Exception e) { - low = null; - } - try { - high = new PQ(new BigDecimal(maximum), unit.replaceAll("\\s","_")); - } catch (Exception e) { - high = null; - } - - if(low != null || high != null) { - observationRange.setValue(new IVL(low, high)); - } - } else { - return null; - } - - return new ArrayList(Arrays.asList(referenceRange)); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModel.java deleted file mode 100644 index 6476b24bc5..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModel.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.LabComponent; -import org.oscarehr.e2e.model.PatientExport.LabOrganizer; -import org.oscarehr.e2e.util.EverestUtils; - -public class ResultOrganizerModel { - private LabOrganizer labOrganizer; - - public EntryRelationship getEntryRelationship(LabOrganizer labOrganizer) { - if(labOrganizer == null) { - this.labOrganizer = new LabOrganizer(null, null); - } else { - this.labOrganizer = labOrganizer; - } - - EntryRelationship entryRelationship = new EntryRelationship(); - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.RESULT_ORGANIZER_TEMPLATE_ID))); - - Organizer organizer = new Organizer(x_ActClassDocumentEntryOrganizer.BATTERY); - organizer.setId(getIds()); - organizer.setCode(getCode()); - organizer.setStatusCode(getStatusCode()); - organizer.setComponent(getResultComponents()); - - entryRelationship.setClinicalStatement(organizer); - return entryRelationship; - } - - private SET getIds() { - if(labOrganizer.getGroupId() != null) { - return EverestUtils.buildUniqueId(Constants.IdPrefixes.LabOBR, labOrganizer.getGroupId()); - } else { - return null; - } - } - - private CD getCode() { - CD code = new CD(); - code.setNullFlavor(NullFlavor.Unknown); - return code; - } - - private CS getStatusCode() { - CS statusCode = new CS(); - if(labOrganizer.getReportStatus() == null) { - statusCode.setNullFlavor(NullFlavor.Unknown); - } else if(labOrganizer.getReportStatus().equalsIgnoreCase("P")) { - statusCode.setCodeEx(ActStatus.Active); - } else { - statusCode.setCodeEx(ActStatus.Completed); - } - return statusCode; - } - - private ArrayList getResultComponents() { - ArrayList resultComponents = new ArrayList(); - - List labComponents = labOrganizer.getLabComponent(); - if(labComponents.isEmpty()) { - resultComponents.add(new ResultComponentModel().getComponent(null)); - } else { - for(LabComponent labComponent : labComponents) { - resultComponents.add(new ResultComponentModel().getComponent(labComponent)); - } - } - - return resultComponents; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/AbstractObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/AbstractObservationModel.java deleted file mode 100644 index 21b489f7c8..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/AbstractObservationModel.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.oscarehr.e2e.constant.Constants; - -abstract class AbstractObservationModel { - protected EntryRelationship entryRelationship; - protected Observation observation; - - protected AbstractObservationModel() { - this.entryRelationship = new EntryRelationship(); - this.observation = new Observation(); - - CD code = new CD(); - code.setCodeSystem(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID); - code.setCodeSystemName(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME); - observation.setCode(code); - - entryRelationship.setClinicalStatement(observation); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModel.java deleted file mode 100644 index 8a1099cc63..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModel.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class CommentObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String comment, Date time, String author) { - if(!EverestUtils.isNullorEmptyorWhitespace(comment)) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.COMMENT_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.COMMENT.toString()); - observation.setText(new ED(comment)); - if(time != null) { - observation.setEffectiveTime(EverestUtils.buildTSFromDate(time), null); - } - if(!EverestUtils.isNullorEmptyorWhitespace(author)) { - observation.setAuthor(new ArrayList(Arrays.asList(new AuthorParticipationModel(author).getAuthor(time)))); - } - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModel.java deleted file mode 100644 index 83685364ab..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModel.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class DateObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(Date date) { - if(date != null) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.DATE_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.DATEOBS.toString()); - observation.setEffectiveTime(EverestUtils.buildTSFromDate(date), null); - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModel.java deleted file mode 100644 index 781dd06ce6..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModel.java +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.PIVL; -import org.marc.everest.datatypes.interfaces.ISetComponent; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.template.ConsumableModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class DoseObservationModel { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - - private Drug drug; - - public EntryRelationship getEntryRelationship(Drug drug) { - if(drug == null) { - this.drug = new Drug(); - } else { - this.drug = drug; - } - - EntryRelationship entryRelationship = new EntryRelationship(); - ArrayList> doseTimes = new ArrayList>(); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.RQO, getConsumable()); - - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.TemplateOids.DOSE_OBSERVATION_TEMPLATE_ID))); - - doseTimes.add(getDuration()); - doseTimes.add(getFrequency()); - - substanceAdministration.setText(getDoseInstructions()); - substanceAdministration.setEffectiveTime(doseTimes); - substanceAdministration.setRouteCode(getRoute()); - substanceAdministration.setDoseQuantity(getDoseQuantity()); - substanceAdministration.setAdministrationUnitCode(getForm()); - - entryRelationship.setClinicalStatement(substanceAdministration); - - return entryRelationship; - } - - private Consumable getConsumable() { - return new ConsumableModel().getConsumable(drug); - } - - private ED getDoseInstructions() { - StringBuilder sb = new StringBuilder("Take"); - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDosage())) { - sb.append(" " + drug.getDosage()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getFreqCode())) { - sb.append(" " + drug.getFreqCode()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDuration())) { - sb.append(" " + drug.getDuration()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDurUnit())) { - sb.append(" " + drug.getDurUnit()); - } - - return new ED(sb.toString()); - } - - private ISetComponent getDuration() { - IVL ivl = new IVL(); - - try { - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDuration()) && drug.getDuration() != "0" && - !EverestUtils.isNullorEmptyorWhitespace(drug.getDurUnit())) { - BigDecimal duration = new BigDecimal(drug.getDuration()); - ivl.setWidth(new PQ(duration, drug.getDurUnit())); - } else { - ivl.setNullFlavor(NullFlavor.Unknown); - } - } catch (NumberFormatException e) { - log.warn("Duration " + drug.getDuration() + " not a number"); - ivl.setNullFlavor(NullFlavor.Unknown); - } - - return ivl; - } - - private ISetComponent getFrequency() { - ISetComponent iSetComponent; - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getFreqCode())) { - if(Mappings.frequencyInterval.containsKey(drug.getFreqCode())) { - iSetComponent = Mappings.frequencyInterval.get(drug.getFreqCode()); - } else { - iSetComponent = new PIVL(); - iSetComponent.setNullFlavor(new CS(NullFlavor.Other)); - } - } else { - iSetComponent = new PIVL(); - iSetComponent.setNullFlavor(new CS(NullFlavor.Unknown)); - } - - return iSetComponent; - } - - private CE getRoute() { - CE code = null; - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getRoute())) { - code = new CE(drug.getRoute().toUpperCase(), Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_OID); - code.setCodeSystemName(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_NAME); - } - - return code; - } - - private IVL getDoseQuantity() { - String unit = null; - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getUnitName())) { - unit = drug.getUnitName().replaceAll("\\s", "_"); - } - - PQ low = new PQ(BigDecimal.valueOf(drug.getTakeMin()), unit); - PQ high = new PQ(BigDecimal.valueOf(drug.getTakeMax()), unit); - - return new IVL(low, high); - } - - private CE getForm() { - CE code = null; - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDrugForm()) && - Mappings.formCode.containsKey(drug.getDrugForm())) { - code = new CE(Mappings.formCode.get(drug.getDrugForm()), Constants.CodeSystems.ADMINISTERABLE_DRUG_FORM_OID); - code.setCodeSystemName(Constants.CodeSystems.ADMINISTERABLE_DRUG_FORM_NAME); - code.setDisplayName(drug.getDrugForm()); - } - - return code; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModel.java deleted file mode 100644 index 742408c451..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModel.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class InstructionObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String value) { - if(!EverestUtils.isNullorEmptyorWhitespace(value)) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.INSTRUCTION_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.INSTRUCT.toString()); - observation.setParticipant(getParticipant()); - observation.setText(new ED(value)); - } else { - entryRelationship = null; - } - - return entryRelationship; - } - - private ArrayList getParticipant() { - Participant2 participant = new Participant2(); - ParticipantRole role = new ParticipantRole(new CS(Constants.RoleClass.ROL.toString())); - - participant.setTypeCode(new CS(ParticipationType.PrimaryInformationRecipient)); - participant.setContextControlCode(new CS(ContextControl.OverridingPropagating)); - - role.setCode(Constants.RoleClass.PAT.toString(), Constants.CodeSystems.ROLE_CLASS_OID); - role.getCode().setCodeSystemName(Constants.CodeSystems.ROLE_CLASS_NAME); - role.setPlayingEntityChoice(new PlayingEntity(EntityClassRoot.Person)); - - participant.setParticipantRole(role); - - return new ArrayList(Arrays.asList(participant)); - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModel.java deleted file mode 100644 index 64068f6a16..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModel.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; - -public class LifestageObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String lifeStage) { - if(Mappings.lifeStageCode.containsKey(lifeStage)) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.LIFESTAGE_OBSERVATION_TEMPLATE_ID))); - - CD value = new CD(Mappings.lifeStageCode.get(lifeStage), Constants.CodeSystems.SNOMED_CT_OID); - value.setCodeSystemName(Constants.CodeSystems.SNOMED_CT_NAME); - value.setDisplayName(Mappings.lifeStageName.get(lifeStage)); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.LIFEOBS.toString()); - observation.setValue(value); - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModel.java deleted file mode 100644 index f02ee26130..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModel.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; - -public class OrderIndicatorObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(Boolean prn) { - if(prn != null) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.ORDER_INDICATOR_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.PRNIND.toString()); - observation.setValue(new BL(prn)); - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModel.java deleted file mode 100644 index 4d575d0330..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModel.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ReactionObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String reaction, Date time, String author, Date authorDate, String severity) { - if(!EverestUtils.isNullorEmptyorWhitespace(reaction)) { - ArrayList entryRelationships = new ArrayList(); - - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.REACTION_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.REACTOBS.toString()); - observation.setText(new ED(reaction)); - - if(time != null) { - observation.setEffectiveTime(new IVL(EverestUtils.buildTSFromDate(time), null)); - } - - CD value = new CD(); - value.setNullFlavor(NullFlavor.NoInformation); - observation.setValue(value); - - if(!EverestUtils.isNullorEmptyorWhitespace(author)) { - observation.setAuthor(new ArrayList(Arrays.asList(new AuthorParticipationModel(author).getAuthor(authorDate)))); - } - - entryRelationships.add(new SeverityObservationModel().getEntryRelationship(severity)); - observation.setEntryRelationship(entryRelationships); - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModel.java deleted file mode 100644 index 4ced1487b2..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModel.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ReasonObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String reason, Date time, String author) { - if(!EverestUtils.isNullorEmptyorWhitespace(reason)) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.REASON_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.REASON.toString()); - observation.setText(new ED(reason)); - - SET id = new SET(); - id.setNullFlavor(NullFlavor.NoInformation); - observation.setId(id); - - IVL ivl = new IVL(); - if(time != null) { - ivl.setLow(EverestUtils.buildTSFromDate(time)); - } else { - ivl.setNullFlavor(NullFlavor.NoInformation); - } - observation.setEffectiveTime(ivl); - - CD value = new CD(); - value.setNullFlavor(NullFlavor.NoInformation); - observation.setValue(value); - - if(!EverestUtils.isNullorEmptyorWhitespace(author)) { - observation.setAuthor(new ArrayList(Arrays.asList(new AuthorParticipationModel(author).getAuthor(time)))); - } - } else { - entryRelationship = null; - } - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModel.java deleted file mode 100644 index b2c48b6dc9..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModel.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class SecondaryCodeICD9ObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String value) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.HasComponent); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.SECONDARY_CODE_ICD9_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.ICD9CODE.toString()); - - CD icd9Value = new CD(); - if(!EverestUtils.isNullorEmptyorWhitespace(value)) { - String description = EverestUtils.getICD9Description(value); - if(!EverestUtils.isNullorEmptyorWhitespace(description)) { - icd9Value.setDisplayName(description); - } - icd9Value.setCodeEx(value); - icd9Value.setCodeSystem(Constants.CodeSystems.ICD9_OID); - icd9Value.setCodeSystemName(Constants.CodeSystems.ICD9_NAME); - } else { - icd9Value.setNullFlavor(NullFlavor.Unknown); - } - observation.setValue(icd9Value); - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModel.java deleted file mode 100644 index 736b42b201..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModel.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; - -public class SeverityObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String severity) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.SEVERITY_OBSERVATION_TEMPLATE_ID))); - - CD value = new CD(); - if(Mappings.allergyTestValue.containsKey(severity)) { - value.setCodeEx(Mappings.allergyTestValue.get(severity)); - value.setCodeSystem(Constants.CodeSystems.OBSERVATION_VALUE_OID); - value.setCodeSystemName(Constants.CodeSystems.OBSERVATION_VALUE_NAME); - value.setDisplayName(Mappings.allergyTestName.get(severity)); - } else { - value.setNullFlavor(NullFlavor.Unknown); - } - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.SEV.toString()); - observation.setValue(value); - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModel.java b/src/main/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModel.java deleted file mode 100644 index f1175e5862..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModel.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import java.util.Arrays; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.util.EverestUtils; - -public class UnboundObservationModel extends AbstractObservationModel { - public EntryRelationship getEntryRelationship(String value) { - entryRelationship.setTypeCode(x_ActRelationshipEntryRelationship.SUBJ); - entryRelationship.setContextConductionInd(true); - entryRelationship.setTemplateId(Arrays.asList(new II(Constants.ObservationOids.UNBOUND_OBSERVATION_TEMPLATE_ID))); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.getCode().setCodeEx(Constants.ObservationType.UNBOUND.toString()); - - ED text = new ED(); - if(!EverestUtils.isNullorEmptyorWhitespace(value)) { - text.setData(value); - } else { - text.setNullFlavor(NullFlavor.NoInformation); - } - observation.setText(text); - - return entryRelationship; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/AbstractPopulator.java b/src/main/java/org/oscarehr/e2e/populator/AbstractPopulator.java deleted file mode 100644 index 58485bb5c5..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/AbstractPopulator.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator; - -import java.util.ArrayList; -import java.util.List; - -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; - -public abstract class AbstractPopulator { - protected List populators; - protected ClinicalDocument clinicalDocument; - - protected AbstractPopulator() { - populators = new ArrayList(); - } - - public abstract void populate(); - - protected static void doPopulate(AbstractPopulator populator) { - for(AbstractPopulator subPopulator : populator.populators) { - subPopulator.populate(); - AbstractPopulator.doPopulate(subPopulator); - } - } - - public ClinicalDocument getClinicalDocument() { - return clinicalDocument; - } - - public static void setClinicalDocument(ClinicalDocument clinicalDocument, List populators) { - for(AbstractPopulator populator : populators) { - populator.clinicalDocument = clinicalDocument; - setClinicalDocument(clinicalDocument, populator.populators); - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/EmrExportPopulator.java b/src/main/java/org/oscarehr/e2e/populator/EmrExportPopulator.java deleted file mode 100644 index 2a578935a3..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/EmrExportPopulator.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.populator.body.DocumentBodyPopulator; -import org.oscarehr.e2e.populator.header.HeaderPopulator; - -public class EmrExportPopulator extends AbstractPopulator { - public EmrExportPopulator(PatientExport patientExport, CE code, II templateId) { - if(patientExport.isLoaded()) { - this.populators.add(new HeaderPopulator(patientExport, code, templateId)); - this.populators.add(new DocumentBodyPopulator(patientExport)); - - this.clinicalDocument = new ClinicalDocument(); - AbstractPopulator.setClinicalDocument(clinicalDocument, this.populators); - } - else { - this.clinicalDocument = null; - } - } - - @Override - public void populate() { - AbstractPopulator.doPopulate(this); - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulator.java deleted file mode 100644 index ba88aa73fa..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulator.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.SD; -import org.marc.everest.datatypes.doc.StructDocElementNode; -import org.marc.everest.datatypes.doc.StructDocTextNode; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component3; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Section; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.e2e.constant.BodyConstants.AbstractBodyConstants; -import org.oscarehr.e2e.constant.BodyConstants.SectionPriority; -import org.oscarehr.e2e.populator.AbstractPopulator; - -public abstract class AbstractBodyPopulator extends AbstractPopulator { - protected AbstractBodyConstants bodyConstants; - protected ArrayList entries = new ArrayList(); - - @Override - public void populate() { - Component3 component = makeSectionComponent(); - - //entries = new ArrayList(); // Null Entry Cascade test line override - if(entries.isEmpty() && bodyConstants.SECTION_PRIORITY == SectionPriority.SHALL) { - ClinicalStatement clinicalStatement = populateNullFlavorClinicalStatement(); - if(clinicalStatement != null) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true), clinicalStatement); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entries.add(entry); - } - } - - component.getSection().setEntry(entries); - clinicalDocument.getComponent().getBodyChoiceIfStructuredBody().getComponent().add(component); - } - - abstract public ClinicalStatement populateClinicalStatement(List list); - // TODO [MARC-HI] Wait for Null Cascade support refactor - abstract public ClinicalStatement populateNullFlavorClinicalStatement(); - abstract public List populateText(); - - private Component3 makeSectionComponent() { - List texts = populateText(); - Component3 component = new Component3(); - component.setTypeCode(ActRelationshipHasComponent.HasComponent); - component.setContextConductionInd(true); - - Section section = new Section(); - section.setCode(new CE(bodyConstants.CODE, bodyConstants.CODE_SYSTEM, bodyConstants.CODE_SYSTEM_NAME, null)); - - if(entries.isEmpty()) { - section.setTemplateId(Arrays.asList(new II(bodyConstants.WITHOUT_ENTRIES_TEMPLATE_ID))); - section.setTitle(bodyConstants.WITHOUT_ENTRIES_TITLE); - } else { - section.setTemplateId(Arrays.asList(new II(bodyConstants.WITH_ENTRIES_TEMPLATE_ID))); - section.setTitle(bodyConstants.WITH_ENTRIES_TITLE); - section.setConfidentialityCode(x_BasicConfidentialityKind.Normal); - } - - if(texts == null || texts.isEmpty()) { - section.setText(new SD(new StructDocTextNode(bodyConstants.ENTRY_NO_TEXT))); - } else { - StructDocElementNode list = new StructDocElementNode("list"); - for(String text : texts) { - list.addElement("item", text); - } - section.setText(new SD(list)); - } - - component.setSection(section); - return component; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulator.java deleted file mode 100644 index 5b595383b6..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulator.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.BodyConstants.AdvanceDirectives; -import org.oscarehr.e2e.util.EverestUtils; - -public class AdvanceDirectivesPopulator extends AbstractBodyPopulator { - AdvanceDirectivesPopulator() { - bodyConstants = AdvanceDirectives.getConstants(); - populateClinicalStatement(Arrays.asList(this)); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - return null; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(EverestUtils.buildUniqueId(Constants.IdPrefixes.AdvanceDirectives, 0)); - observation.setCode(new CD() {{setNullFlavor(NullFlavor.NoInformation);}}); - observation.setText(new ED() {{setNullFlavor(NullFlavor.NoInformation);}}); - observation.setStatusCode(ActStatus.Completed); - observation.setEffectiveTime(new IVL() {{setNullFlavor(NullFlavor.NoInformation);}}); - - return observation; - } - - @Override - public List populateText() { - return null; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/AlertsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/AlertsPopulator.java deleted file mode 100644 index e2d2cb3bc2..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/AlertsPopulator.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.BodyConstants.Alerts; -import org.oscarehr.e2e.extension.ObservationWithConfidentialityCode; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.AlertsModel; - -public class AlertsPopulator extends AbstractBodyPopulator { - private List alerts = null; - - AlertsPopulator(PatientExport patientExport) { - bodyConstants = Alerts.getConstants(); - if(patientExport.isLoaded()) { - alerts = patientExport.getAlerts(); - } - } - - @Override - public void populate() { - if(alerts != null) { - for(CaseManagementNote alert : alerts) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(alert))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - AlertsModel alertsModel = new AlertsModel(list.get(0)); - ObservationWithConfidentialityCode observation = new ObservationWithConfidentialityCode(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(alertsModel.getIds()); - observation.setCode(alertsModel.getCode()); - observation.setStatusCode(alertsModel.getStatusCode()); - observation.setText(alertsModel.getText()); - observation.setEffectiveTime(alertsModel.getEffectiveTime()); - observation.setConfidentialityCode(alertsModel.getConfidentiality()); - - return observation; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - AlertsModel alertsModel = new AlertsModel(null); - ObservationWithConfidentialityCode observation = new ObservationWithConfidentialityCode(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(alertsModel.getIds()); - observation.setCode(alertsModel.getCode()); - observation.setStatusCode(alertsModel.getStatusCode()); - observation.setText(alertsModel.getText()); - observation.setEffectiveTime(alertsModel.getEffectiveTime()); - observation.setConfidentialityCode(alertsModel.getConfidentiality()); - - return observation; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(alerts != null) { - for(CaseManagementNote alert : alerts) { - AlertsModel alertsModel = new AlertsModel(alert); - list.add(alertsModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/AllergiesPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/AllergiesPopulator.java deleted file mode 100644 index 456b3d5982..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/AllergiesPopulator.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Act; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryAct; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentActMood; -import org.oscarehr.common.model.Allergy; -import org.oscarehr.e2e.constant.BodyConstants.Allergies; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.AllergiesModel; - -public class AllergiesPopulator extends AbstractBodyPopulator { - private List allergies = null; - - AllergiesPopulator(PatientExport patientExport) { - bodyConstants = Allergies.getConstants(); - if(patientExport.isLoaded()) { - allergies = patientExport.getAllergies(); - } - } - - @Override - public void populate() { - if(allergies != null) { - for(Allergy allergy : allergies) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(allergy))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - AllergiesModel allergiesModel = new AllergiesModel(list.get(0)); - Act act = new Act(x_ActClassDocumentEntryAct.Act, x_DocumentActMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - act.setId(allergiesModel.getIds()); - act.setCode(allergiesModel.getCode()); - act.setStatusCode(allergiesModel.getStatusCode()); - act.setEffectiveTime(allergiesModel.getEffectiveTime()); - - entryRelationships.add(allergiesModel.getAllergyObservation()); - - act.setEntryRelationship(entryRelationships); - return act; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - AllergiesModel allergiesModel = new AllergiesModel(null); - Act act = new Act(x_ActClassDocumentEntryAct.Act, x_DocumentActMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - act.setId(allergiesModel.getIds()); - act.setCode(allergiesModel.getCode()); - act.setStatusCode(allergiesModel.getStatusCode()); - act.setEffectiveTime(allergiesModel.getEffectiveTime()); - - entryRelationships.add(allergiesModel.getAllergyObservation()); - - act.setEntryRelationship(entryRelationships); - return act; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(allergies != null) { - for(Allergy allergy : allergies) { - AllergiesModel allergiesModel = new AllergiesModel(allergy); - list.add(allergiesModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulator.java deleted file mode 100644 index 1590f80948..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulator.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.e2e.constant.BodyConstants.ClinicallyMeasuredObservations; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.ClinicallyMeasuredObservationsModel; - -public class ClinicallyMeasuredObservationsPopulator extends AbstractBodyPopulator { - private List measurements = null; - - ClinicallyMeasuredObservationsPopulator(PatientExport patientExport) { - bodyConstants = ClinicallyMeasuredObservations.getConstants(); - if(patientExport.isLoaded()) { - measurements = patientExport.getMeasurements(); - } - } - - @Override - public void populate() { - if(measurements != null) { - for(Measurement measurement : measurements) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(measurement))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List measurement) { - ClinicallyMeasuredObservationsModel cmoModel = new ClinicallyMeasuredObservationsModel(measurement.get(0)); - Organizer organizer = new Organizer(x_ActClassDocumentEntryOrganizer.CLUSTER); - - organizer.setId(cmoModel.getIds()); - organizer.setCode(cmoModel.getCode()); - organizer.setStatusCode(cmoModel.getStatusCode()); - organizer.setAuthor(cmoModel.getAuthor()); - organizer.setComponent(cmoModel.getComponents()); - - return organizer; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - return null; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(measurements != null) { - for(Measurement measurement : measurements) { - ClinicallyMeasuredObservationsModel cmoModel = new ClinicallyMeasuredObservationsModel(measurement); - list.add(cmoModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/DocumentBodyPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/DocumentBodyPopulator.java deleted file mode 100644 index 0eb6364241..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/DocumentBodyPopulator.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; - -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component3; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.StructuredBody; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.populator.AbstractPopulator; - -public class DocumentBodyPopulator extends AbstractPopulator { - public DocumentBodyPopulator(PatientExport patientExport) { - populators.add(new AdvanceDirectivesPopulator()); - populators.add(new AlertsPopulator(patientExport)); - populators.add(new AllergiesPopulator(patientExport)); - populators.add(new ClinicallyMeasuredObservationsPopulator(patientExport)); - populators.add(new EncountersPopulator(patientExport)); - populators.add(new FamilyHistoryPopulator(patientExport)); - populators.add(new ImmunizationsPopulator(patientExport)); - populators.add(new LabsPopulator(patientExport)); - populators.add(new MedicationsPopulator(patientExport)); - populators.add(new OrdersAndRequestsPopulator()); - populators.add(new ProblemsPopulator(patientExport)); - populators.add(new RiskFactorsPopulator(patientExport)); - } - - @Override - public void populate() { - Component2 bodyComponent = new Component2(); - bodyComponent.setTypeCode(ActRelationshipHasComponent.HasComponent); - bodyComponent.setContextConductionInd(true); - bodyComponent.setBodyChoice(getStructuredBody()); - - clinicalDocument.setComponent(bodyComponent); - } - - public StructuredBody getStructuredBody() { - StructuredBody body = new StructuredBody(); - ArrayList sectionComponents = new ArrayList(); - - body.setConfidentialityCode(x_BasicConfidentialityKind.Normal); - body.setLanguageCode(Constants.DocumentHeader.LANGUAGE_ENGLISH_CANADIAN); - body.setComponent(sectionComponents); - return body; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/EncountersPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/EncountersPopulator.java deleted file mode 100644 index 6f5897754f..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/EncountersPopulator.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Encounter; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentEncounterMood; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.BodyConstants.Encounters; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.EncountersModel; - -public class EncountersPopulator extends AbstractBodyPopulator { - private List encounters = null; - - EncountersPopulator(PatientExport patientExport) { - bodyConstants = Encounters.getConstants(); - if(patientExport.isLoaded()) { - encounters = patientExport.getEncounters(); - } - } - - @Override - public void populate() { - if(encounters != null) { - for(CaseManagementNote encounter : encounters) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(encounter))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - EncountersModel encountersModel = new EncountersModel(list.get(0)); - Encounter encounter = new Encounter(x_DocumentEncounterMood.Eventoccurrence); - ArrayList participants = new ArrayList(); - ArrayList entryRelationships = new ArrayList(); - - encounter.setId(encountersModel.getIds()); - encounter.setEffectiveTime(encountersModel.getEffectiveTime()); - participants.add(encountersModel.getEncounterLocation()); - participants.add(encountersModel.getEncounterProvider()); - entryRelationships.add(encountersModel.getEncounterNote()); - - encounter.setParticipant(participants); - encounter.setEntryRelationship(entryRelationships); - return encounter; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - EncountersModel encountersModel = new EncountersModel(null); - Encounter encounter = new Encounter(x_DocumentEncounterMood.Eventoccurrence); - ArrayList participants = new ArrayList(); - ArrayList entryRelationships = new ArrayList(); - - encounter.setId(encountersModel.getIds()); - encounter.setEffectiveTime(encountersModel.getEffectiveTime()); - participants.add(encountersModel.getEncounterLocation()); - participants.add(encountersModel.getEncounterProvider()); - entryRelationships.add(encountersModel.getEncounterNote()); - - encounter.setParticipant(participants); - encounter.setEntryRelationship(entryRelationships); - return encounter; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(encounters != null) { - for(CaseManagementNote encounter : encounters) { - EncountersModel encountersModel = new EncountersModel(encounter); - list.add(encountersModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulator.java deleted file mode 100644 index ca82677411..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulator.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.e2e.constant.BodyConstants.FamilyHistory; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.PatientExport.FamilyHistoryEntry; -import org.oscarehr.e2e.model.export.body.FamilyHistoryModel; - -public class FamilyHistoryPopulator extends AbstractBodyPopulator { - private List familyHistory = null; - - FamilyHistoryPopulator(PatientExport patientExport) { - bodyConstants = FamilyHistory.getConstants(); - if(patientExport.isLoaded()) { - familyHistory = patientExport.getFamilyHistory(); - } - } - - @Override - public void populate() { - if(familyHistory != null) { - for(FamilyHistoryEntry familyEntry : familyHistory) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(familyEntry))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - FamilyHistoryModel familyHistoryModel = new FamilyHistoryModel(list.get(0)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - observation.setId(familyHistoryModel.getIds()); - observation.setCode(familyHistoryModel.getCode()); - observation.setText(familyHistoryModel.getText()); - observation.setEffectiveTime(familyHistoryModel.getEffectiveTime()); - observation.setValue(familyHistoryModel.getValue()); - observation.setSubject(familyHistoryModel.getSubject()); - - entryRelationships.add(familyHistoryModel.getTreatmentComment()); - entryRelationships.add(familyHistoryModel.getBillingCode()); - entryRelationships.add(familyHistoryModel.getLifestageOnset()); - entryRelationships.add(familyHistoryModel.getAgeAtOnset()); - - observation.setEntryRelationship(entryRelationships); - return observation; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - FamilyHistoryModel familyHistoryModel = new FamilyHistoryModel(null); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - observation.setId(familyHistoryModel.getIds()); - observation.setCode(familyHistoryModel.getCode()); - observation.setText(familyHistoryModel.getText()); - observation.setEffectiveTime(familyHistoryModel.getEffectiveTime()); - observation.setValue(familyHistoryModel.getValue()); - observation.setSubject(familyHistoryModel.getSubject()); - - entryRelationships.add(familyHistoryModel.getTreatmentComment()); - entryRelationships.add(familyHistoryModel.getBillingCode()); - entryRelationships.add(familyHistoryModel.getLifestageOnset()); - entryRelationships.add(familyHistoryModel.getAgeAtOnset()); - - observation.setEntryRelationship(entryRelationships); - return observation; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(familyHistory != null) { - for(FamilyHistoryEntry familyEntry : familyHistory) { - FamilyHistoryModel familyHistoryModel = new FamilyHistoryModel(familyEntry); - list.add(familyHistoryModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulator.java deleted file mode 100644 index fc25324dd0..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulator.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.e2e.constant.BodyConstants.Immunizations; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.PatientExport.Immunization; -import org.oscarehr.e2e.model.export.body.ImmunizationsModel; - -public class ImmunizationsPopulator extends AbstractBodyPopulator { - private List immunizations = null; - - ImmunizationsPopulator(PatientExport patientExport) { - bodyConstants = Immunizations.getConstants(); - if(patientExport.isLoaded()) { - immunizations = patientExport.getImmunizations(); - } - } - - @Override - public void populate() { - if(immunizations != null) { - for(Immunization immunization : immunizations) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(immunization))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - ImmunizationsModel immunizationsModel = new ImmunizationsModel(list.get(0)); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - substanceAdministration.setNegationInd(immunizationsModel.getNegationInd()); - substanceAdministration.setId(immunizationsModel.getIds()); - substanceAdministration.setCode(immunizationsModel.getCode()); - substanceAdministration.setEffectiveTime(immunizationsModel.getEffectiveTime()); - substanceAdministration.setRouteCode(immunizationsModel.getRoute()); - substanceAdministration.setConsumable(immunizationsModel.getConsumable()); - substanceAdministration.setAuthor(immunizationsModel.getAuthor()); - substanceAdministration.setParticipant(immunizationsModel.getParticipant()); - - entryRelationships.add(immunizationsModel.getAntigenType()); - entryRelationships.add(immunizationsModel.getRefusalReason()); - entryRelationships.add(immunizationsModel.getNextDate()); - entryRelationships.add(immunizationsModel.getComment()); - - substanceAdministration.setEntryRelationship(entryRelationships); - return substanceAdministration; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - ImmunizationsModel immunizationsModel = new ImmunizationsModel(null); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - substanceAdministration.setNegationInd(immunizationsModel.getNegationInd()); - substanceAdministration.setId(immunizationsModel.getIds()); - substanceAdministration.setCode(immunizationsModel.getCode()); - substanceAdministration.setEffectiveTime(immunizationsModel.getEffectiveTime()); - substanceAdministration.setRouteCode(immunizationsModel.getRoute()); - substanceAdministration.setConsumable(immunizationsModel.getConsumable()); - substanceAdministration.setAuthor(immunizationsModel.getAuthor()); - substanceAdministration.setParticipant(immunizationsModel.getParticipant()); - - entryRelationships.add(immunizationsModel.getAntigenType()); - entryRelationships.add(immunizationsModel.getRefusalReason()); - entryRelationships.add(immunizationsModel.getNextDate()); - entryRelationships.add(immunizationsModel.getComment()); - - substanceAdministration.setEntryRelationship(entryRelationships); - return substanceAdministration; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(immunizations != null) { - for(Immunization immunization : immunizations) { - ImmunizationsModel immunizationsModel = new ImmunizationsModel(immunization); - list.add(immunizationsModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/LabsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/LabsPopulator.java deleted file mode 100644 index 95b21505ad..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/LabsPopulator.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.e2e.constant.BodyConstants.Labs; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.PatientExport.Lab; -import org.oscarehr.e2e.model.export.body.LabsModel; - -public class LabsPopulator extends AbstractBodyPopulator { - private List labs = null; - - LabsPopulator(PatientExport patientExport) { - bodyConstants = Labs.getConstants(); - if(patientExport.isLoaded()) { - labs = patientExport.getLabs(); - } - } - - @Override - public void populate() { - if(labs != null) { - for(Lab lab : labs) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(lab))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - LabsModel labsModel = new LabsModel(list.get(0)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(labsModel.getIds()); - observation.setCode(labsModel.getCode()); - observation.setText(labsModel.getText()); - observation.setAuthor(labsModel.getAuthor()); - observation.setEntryRelationship(labsModel.getResultOrganizers()); - - return observation; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - LabsModel labsModel = new LabsModel(null); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(labsModel.getIds()); - observation.setCode(labsModel.getCode()); - observation.setText(labsModel.getText()); - observation.setAuthor(labsModel.getAuthor()); - observation.setEntryRelationship(labsModel.getResultOrganizers()); - - return observation; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(labs != null) { - for(Lab lab : labs) { - LabsModel labsModel = new LabsModel(lab); - list.add(labsModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/MedicationsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/MedicationsPopulator.java deleted file mode 100644 index 808ad61310..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/MedicationsPopulator.java +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.BodyConstants.Medications; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.MedicationsModel; - -public class MedicationsPopulator extends AbstractBodyPopulator { - private List allDrugs = null; - private Map> mapDrugs = null; - - MedicationsPopulator(PatientExport patientExport) { - bodyConstants = Medications.getConstants(); - mapDrugs = new HashMap>(); - if(patientExport.isLoaded()) { - allDrugs = patientExport.getMedications(); - } - Collections.reverse(allDrugs); // Order recent drugs first - - if(allDrugs != null) { - for(Drug drug : allDrugs) { - Integer din; - try { - din = Integer.parseInt(drug.getRegionalIdentifier()); - } catch (NumberFormatException e) { - din = Constants.Runtime.INVALID_VALUE; - } - - if(mapDrugs.containsKey(din)) { - mapDrugs.get(din).add(drug); - } else { - mapDrugs.put(din, new ArrayList(Arrays.asList(drug))); - } - } - } - } - - @Override - public void populate() { - for(List medication : mapDrugs.values()) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(medication)); - entries.add(entry); - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - Boolean medicationEventPopulated = false; - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - for(Drug drug : list) { - MedicationsModel medicationsModel = new MedicationsModel(drug); - - if(!medicationEventPopulated) { - substanceAdministration.setId(medicationsModel.getIds()); - substanceAdministration.setCode(medicationsModel.getCode()); - substanceAdministration.setStatusCode(medicationsModel.getStatusCode()); - substanceAdministration.setConsumable(medicationsModel.getConsumable()); - - entryRelationships.add(medicationsModel.getRecordType()); - entryRelationships.add(medicationsModel.getLastReviewDate()); - - medicationEventPopulated = true; - } - - entryRelationships.add(medicationsModel.getPrescriptionInformation()); - } - - substanceAdministration.setEntryRelationship(entryRelationships); - - return substanceAdministration; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - MedicationsModel medicationsModel = new MedicationsModel(null); - SubstanceAdministration substanceAdministration = new SubstanceAdministration(x_DocumentSubstanceMood.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - substanceAdministration.setId(medicationsModel.getIds()); - substanceAdministration.setCode(medicationsModel.getCode()); - substanceAdministration.setStatusCode(medicationsModel.getStatusCode()); - substanceAdministration.setConsumable(medicationsModel.getConsumable()); - - entryRelationships.add(medicationsModel.getRecordType()); - entryRelationships.add(medicationsModel.getLastReviewDate()); - - substanceAdministration.setEntryRelationship(entryRelationships); - - return substanceAdministration; - } - - @Override - public List populateText() { - List list = new ArrayList(); - for(List medication : mapDrugs.values()) { - MedicationsModel medicationsModel = new MedicationsModel(medication.get(0)); - list.add(medicationsModel.getTextSummary()); - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulator.java deleted file mode 100644 index 2a9ac0c8c4..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulator.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedEntity; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Performer2; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.BodyConstants.OrdersAndRequests; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class OrdersAndRequestsPopulator extends AbstractBodyPopulator { - OrdersAndRequestsPopulator() { - bodyConstants = OrdersAndRequests.getConstants(); - populateClinicalStatement(Arrays.asList(this)); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - return null; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - Observation observation = new Observation(x_ActMoodDocumentObservation.RQO); - - observation.setId(EverestUtils.buildUniqueId(Constants.IdPrefixes.Referrals, 0)); - observation.setCode(new CD() {{setNullFlavor(NullFlavor.NoInformation);}}); - observation.setText(new ED() {{setNullFlavor(NullFlavor.NoInformation);}}); - observation.setEffectiveTime(new IVL() {{setNullFlavor(NullFlavor.NoInformation);}}); - - II ii = new II(); - ii.setNullFlavor(NullFlavor.NoInformation); - AssignedEntity assignedEntity = new AssignedEntity(); - assignedEntity.setId(new SET(ii)); - Performer2 performer = new Performer2(assignedEntity); - observation.setPerformer(new ArrayList(Arrays.asList(performer))); - observation.setAuthor(new ArrayList(Arrays.asList(new AuthorParticipationModel().getAuthor(null)))); - - return observation; - } - - @Override - public List populateText() { - return null; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/ProblemsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/ProblemsPopulator.java deleted file mode 100644 index 11e7e79e71..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/ProblemsPopulator.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.common.model.Dxresearch; -import org.oscarehr.e2e.constant.BodyConstants.Problems; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.ProblemsModel; - -public class ProblemsPopulator extends AbstractBodyPopulator { - private List allProblems = null; - private List problems = null; - - ProblemsPopulator(PatientExport patientExport) { - bodyConstants = Problems.getConstants(); - if(patientExport.isLoaded()) { - allProblems = patientExport.getProblems(); - } - problems = new ArrayList(); - - if(allProblems != null) { - for(Dxresearch problem : allProblems) { - if(problem.getStatus() != 'D' && problem.getCodingSystem().equalsIgnoreCase("icd9")) { - this.problems.add(problem); - } - } - } - } - - @Override - public void populate() { - for(Dxresearch problem : problems) { - if(problem.getCodingSystem().equals("icd9")) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(problem))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List problem) { - ProblemsModel problemsModel = new ProblemsModel(problem.get(0)); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - ArrayList entryRelationships = new ArrayList(); - - observation.setId(problemsModel.getIds()); - observation.setCode(problemsModel.getCode()); - observation.setText(problemsModel.getText()); - observation.setStatusCode(problemsModel.getStatusCode()); - observation.setEffectiveTime(problemsModel.getEffectiveTime()); - observation.setValue(problemsModel.getValue()); - observation.setAuthor(problemsModel.getAuthor()); - - entryRelationships.add(problemsModel.getSecondaryCodeICD9()); - entryRelationships.add(problemsModel.getDiagnosisDate()); - - observation.setEntryRelationship(entryRelationships); - - return observation; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - ProblemsModel problemsModel = new ProblemsModel(null); - Observation observation = new Observation(x_ActMoodDocumentObservation.Eventoccurrence); - - observation.setId(problemsModel.getIds()); - observation.setCode(problemsModel.getCode()); - observation.setAuthor(problemsModel.getAuthor()); - - return observation; - } - - @Override - public List populateText() { - List list = new ArrayList(); - for(Dxresearch problem : problems) { - if(problem.getCodingSystem().equals("icd9")) { - ProblemsModel problemsModel = new ProblemsModel(problem); - list.add(problemsModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulator.java b/src/main/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulator.java deleted file mode 100644 index 8c682af270..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulator.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.BodyConstants.RiskFactors; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.body.RiskFactorsModel; - -public class RiskFactorsPopulator extends AbstractBodyPopulator { - private List riskFactors = null; - - RiskFactorsPopulator(PatientExport patientExport) { - bodyConstants = RiskFactors.getConstants(); - if(patientExport.isLoaded()) { - riskFactors = patientExport.getRiskFactors(); - } - } - - @Override - public void populate() { - if(riskFactors != null) { - for(CaseManagementNote riskFactor : riskFactors) { - Entry entry = new Entry(x_ActRelationshipEntry.DRIV, new BL(true)); - entry.setTemplateId(Arrays.asList(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - entry.setClinicalStatement(populateClinicalStatement(Arrays.asList(riskFactor))); - entries.add(entry); - } - } - - super.populate(); - } - - @Override - public ClinicalStatement populateClinicalStatement(List list) { - RiskFactorsModel riskFactorsModel = new RiskFactorsModel(list.get(0)); - Organizer organizer = new Organizer(x_ActClassDocumentEntryOrganizer.CLUSTER); - - organizer.setId(riskFactorsModel.getIds()); - organizer.setCode(riskFactorsModel.getCode()); - organizer.setStatusCode(riskFactorsModel.getStatusCode()); - organizer.setAuthor(riskFactorsModel.getAuthor()); - organizer.setComponent(riskFactorsModel.getComponentObservation()); - - return organizer; - } - - @Override - public ClinicalStatement populateNullFlavorClinicalStatement() { - RiskFactorsModel riskFactorsModel = new RiskFactorsModel(null); - Organizer organizer = new Organizer(x_ActClassDocumentEntryOrganizer.CLUSTER); - - organizer.setId(riskFactorsModel.getIds()); - organizer.setCode(riskFactorsModel.getCode()); - organizer.setStatusCode(new CS() {{setNullFlavor(NullFlavor.NoInformation);}}); - organizer.setComponent(riskFactorsModel.getComponentObservation()); - - return organizer; - } - - @Override - public List populateText() { - List list = new ArrayList(); - if(riskFactors != null) { - for(CaseManagementNote riskFactor : riskFactors) { - RiskFactorsModel riskFactorsModel = new RiskFactorsModel(riskFactor); - list.add(riskFactorsModel.getTextSummary()); - } - } - - return list; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/header/AuthorPopulator.java b/src/main/java/org/oscarehr/e2e/populator/header/AuthorPopulator.java deleted file mode 100644 index 080d92a0a6..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/header/AuthorPopulator.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import java.util.ArrayList; -import java.util.GregorianCalendar; - -import org.marc.everest.datatypes.TS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedAuthor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.oscarehr.common.model.ProviderData; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.header.AuthorModel; -import org.oscarehr.e2e.populator.AbstractPopulator; -import org.oscarehr.e2e.util.EverestUtils; - -class AuthorPopulator extends AbstractPopulator { - private final AuthorModel authorModel; - - AuthorPopulator(PatientExport patientExport) { - ProviderData provider = EverestUtils.getProviderFromString(patientExport.getDemographic().getProviderNo()); - authorModel = new AuthorModel(provider); - } - - @Override - public void populate() { - ArrayList authors = new ArrayList(); - - authors.add(getProvider()); - authors.add(getSystem()); - - clinicalDocument.setAuthor(authors); - } - - private Author getProvider() { - Author provider = new Author(); - AssignedAuthor assignedAuthor = new AssignedAuthor(); - - provider.setContextControlCode(ContextControl.OverridingPropagating); - provider.setTime(new GregorianCalendar(), TS.DAY); - provider.setAssignedAuthor(assignedAuthor); - - assignedAuthor.setId(authorModel.getIds()); - assignedAuthor.setTelecom(authorModel.getTelecoms()); - assignedAuthor.setAssignedAuthorChoice(authorModel.getPerson()); - - return provider; - } - - private Author getSystem() { - Author system = new Author(); - AssignedAuthor assignedSystem = new AssignedAuthor(); - - system.setContextControlCode(ContextControl.OverridingPropagating); - system.setTime(new GregorianCalendar(), TS.DAY); - system.setAssignedAuthor(assignedSystem); - - assignedSystem.setId(authorModel.getDeviceIds()); - assignedSystem.setAssignedAuthorChoice(authorModel.getDevice()); - - return system; - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/header/CustodianPopulator.java b/src/main/java/org/oscarehr/e2e/populator/header/CustodianPopulator.java deleted file mode 100644 index ac1a86f420..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/header/CustodianPopulator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedCustodian; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Custodian; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.CustodianOrganization; -import org.oscarehr.common.dao.ClinicDAO; -import org.oscarehr.common.model.Clinic; -import org.oscarehr.e2e.model.export.header.CustodianModel; -import org.oscarehr.e2e.populator.AbstractPopulator; -import org.oscarehr.util.SpringUtils; - -class CustodianPopulator extends AbstractPopulator { - private final CustodianModel custodianModel; - - CustodianPopulator() { - ClinicDAO clinicDao = SpringUtils.getBean(ClinicDAO.class); - Clinic clinic = clinicDao.getClinic(); - custodianModel = new CustodianModel(clinic); - } - - @Override - public void populate() { - Custodian custodian = new Custodian(); - AssignedCustodian assignedCustodian = new AssignedCustodian(); - CustodianOrganization custodianOrganization = new CustodianOrganization(); - - custodian.setAssignedCustodian(assignedCustodian); - assignedCustodian.setRepresentedCustodianOrganization(custodianOrganization); - custodianOrganization.setId(custodianModel.getIds()); - custodianOrganization.setName(custodianModel.getName()); - - clinicalDocument.setCustodian(custodian); - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/header/HeaderPopulator.java b/src/main/java/org/oscarehr/e2e/populator/header/HeaderPopulator.java deleted file mode 100644 index 1169bac557..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/header/HeaderPopulator.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import java.util.GregorianCalendar; -import java.util.UUID; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.vocabulary.BindingRealm; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.populator.AbstractPopulator; - -public class HeaderPopulator extends AbstractPopulator { - private final Demographic demographic; - private final CE code; - private final II templateId; - - public HeaderPopulator(PatientExport patientExport, CE code, II templateId) { - this.demographic = patientExport.getDemographic(); - this.code = code; - this.templateId = templateId; - - populators.add(new RecordTargetPopulator(patientExport)); - populators.add(new AuthorPopulator(patientExport)); - populators.add(new CustodianPopulator()); - populators.add(new InformationRecipientPopulator()); - } - - @Override - public void populate() { - // realmCode - CS binding = new CS(); - binding.setCodeEx(new BindingRealm(Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_REALM_CODE, null)); - clinicalDocument.setRealmCode(new SET>(binding)); - - // typeId - clinicalDocument.setTypeId(new II( - Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_ID, - Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_ID_EXTENSION)); - - // templateId - LIST templateIds = new LIST(); - templateIds.add(new II(Constants.DocumentHeader.TEMPLATE_ID)); - templateIds.add(templateId); - clinicalDocument.setTemplateId(templateIds); - - // id - clinicalDocument.setId(UUID.randomUUID().toString().toUpperCase(), demographic.getDemographicNo().toString()); - - // code - clinicalDocument.setCode(code); - - // title - clinicalDocument.setTitle("E2E-DTC Record of ".concat(demographic.getFirstName()).concat(" ").concat(demographic.getLastName())); - - // effectiveTime - clinicalDocument.setEffectiveTime(new GregorianCalendar(), TS.MINUTE); - - // confidentialityCode - clinicalDocument.setConfidentialityCode(x_BasicConfidentialityKind.Normal); - - // languageCode - clinicalDocument.setLanguageCode(Constants.DocumentHeader.LANGUAGE_ENGLISH_CANADIAN); - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulator.java b/src/main/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulator.java deleted file mode 100644 index 36f47a3c2b..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulator.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.InformationRecipient; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.IntendedRecipient; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_InformationRecipient; -import org.oscarehr.e2e.populator.AbstractPopulator; - -class InformationRecipientPopulator extends AbstractPopulator { - InformationRecipientPopulator() { - } - - @Override - public void populate() { - InformationRecipient informationRecipient = new InformationRecipient(); - IntendedRecipient intendedRecipient = new IntendedRecipient(); - - informationRecipient.setIntendedRecipient(intendedRecipient); - informationRecipient.setTypeCode(x_InformationRecipient.PRCP); - - intendedRecipient.setNullFlavor(NullFlavor.NoInformation); - - clinicalDocument.setInformationRecipient(new ArrayList(Arrays.asList(informationRecipient))); - } -} diff --git a/src/main/java/org/oscarehr/e2e/populator/header/RecordTargetPopulator.java b/src/main/java/org/oscarehr/e2e/populator/header/RecordTargetPopulator.java deleted file mode 100644 index 395ec99bca..0000000000 --- a/src/main/java/org/oscarehr/e2e/populator/header/RecordTargetPopulator.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import java.util.ArrayList; -import java.util.Arrays; - -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Patient; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PatientRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.RecordTarget; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.oscarehr.e2e.model.PatientExport; -import org.oscarehr.e2e.model.export.header.RecordTargetModel; -import org.oscarehr.e2e.populator.AbstractPopulator; - -class RecordTargetPopulator extends AbstractPopulator { - private final RecordTargetModel recordTargetModel; - - RecordTargetPopulator(PatientExport patientExport) { - recordTargetModel = new RecordTargetModel(patientExport.getDemographic()); - } - - @Override - public void populate() { - RecordTarget recordTarget = new RecordTarget(); - PatientRole patientRole = new PatientRole(); - Patient patient = new Patient(); - - recordTarget.setContextControlCode(ContextControl.OverridingPropagating); - recordTarget.setPatientRole(patientRole); - - patientRole.setId(recordTargetModel.getIds()); - patientRole.setAddr(recordTargetModel.getAddresses()); - patientRole.setTelecom(recordTargetModel.getTelecoms()); - patientRole.setPatient(patient); - - patient.setName(recordTargetModel.getNames()); - patient.setAdministrativeGenderCode(recordTargetModel.getGender()); - patient.setBirthTime(recordTargetModel.getBirthDate()); - patient.setLanguageCommunication(recordTargetModel.getLanguages()); - - clinicalDocument.setRecordTarget(new ArrayList(Arrays.asList(recordTarget))); - } -} diff --git a/src/main/java/org/oscarehr/e2e/util/E2EEverestValidator.java b/src/main/java/org/oscarehr/e2e/util/E2EEverestValidator.java deleted file mode 100644 index e952caac65..0000000000 --- a/src/main/java/org/oscarehr/e2e/util/E2EEverestValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.formatters.interfaces.IFormatterGraphResult; -import org.marc.everest.interfaces.IResultDetail; -import org.marc.everest.interfaces.ResultDetailType; - -public class E2EEverestValidator { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - - E2EEverestValidator() { - throw new UnsupportedOperationException(); - } - - public static Boolean isValidCDA(IFormatterGraphResult details) { - Boolean result = true; - - for(IResultDetail dtl : details.getDetails()) { - if(!EverestUtils.isNullorEmptyorWhitespace(dtl.getMessage())) { - if(dtl.getType() == ResultDetailType.INFORMATION) { - log.info(dtl.getMessage()); - } else if (dtl.getType() == ResultDetailType.WARNING) { - log.warn(dtl.getMessage()); - } else { - log.error(dtl.getMessage()); - } - } - - result = false; - } - - return result; - } -} diff --git a/src/main/java/org/oscarehr/e2e/util/E2EXSDValidator.java b/src/main/java/org/oscarehr/e2e/util/E2EXSDValidator.java deleted file mode 100644 index 9540fe2799..0000000000 --- a/src/main/java/org/oscarehr/e2e/util/E2EXSDValidator.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import java.io.File; -import java.io.IOException; -import java.io.StringReader; - -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.apache.logging.log4j.Logger; -import org.xml.sax.EntityResolver; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; - -public class E2EXSDValidator { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - - E2EXSDValidator() { - throw new UnsupportedOperationException(); - } - - public static Boolean isWellFormedXML(String xmlstring) { - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(false); - factory.setNamespaceAware(true); - try { - SAXParser parser = factory.newSAXParser(); - XMLReader reader = parser.getXMLReader(); - reader.setErrorHandler(new SimpleErrorHandler()); - // the parse method throws an exception if the XML is not well-formed - reader.parse(new InputSource(new StringReader(xmlstring))); - return true; - } catch (Exception e) { - log.warn(e.getMessage()); - return false; - } - } - - public static Boolean isValidXML(String xmlstring) { - SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(true); - factory.setNamespaceAware(true); - - try { - SAXParser parser = factory.newSAXParser(); - parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); - XMLReader reader = parser.getXMLReader(); - reader.setErrorHandler(new SimpleErrorHandler()); - reader.setEntityResolver(new E2EEntityResolver()); - reader.parse(new InputSource(new StringReader(xmlstring))); - return true; - } catch (Exception e) { - log.warn(e.getMessage()); - return false; - } - } - - private static class SimpleErrorHandler implements ErrorHandler { - public void warning(SAXParseException e) throws SAXException { - throw new SAXException("(Parsing Warning) " + e.getMessage()); - } - - public void error(SAXParseException e) throws SAXException { - throw new SAXException("(Parsing Error) " + e.getMessage()); - } - - public void fatalError(SAXParseException e) throws SAXException { - throw new SAXException("(Parsing Fatal Error) " + e.getMessage()); - } - } - - private static class E2EEntityResolver implements EntityResolver { - public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { - // Grab only the filename part from the full path - String filename = new File(systemId).getName(); - - // Now prepend the correct path - String correctedId = E2EXSDValidator.class.getResource("/e2e/" + filename).getPath(); - - InputSource is = new InputSource(ClassLoader.getSystemResourceAsStream(correctedId)); - is.setSystemId(correctedId); - - return is; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/util/EverestUtils.java b/src/main/java/org/oscarehr/e2e/util/EverestUtils.java deleted file mode 100644 index 862b7687be..0000000000 --- a/src/main/java/org/oscarehr/e2e/util/EverestUtils.java +++ /dev/null @@ -1,415 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import java.io.InputStream; -import java.io.StringReader; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -import org.apache.logging.log4j.Logger; -import org.jdom.Attribute; -import org.jdom.Element; -import org.jdom.input.SAXBuilder; -import org.marc.everest.datatypes.ADXP; -import org.marc.everest.datatypes.AddressPartType; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNamePartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.TelecommunicationsAddressUse; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.formatters.interfaces.IFormatterGraphResult; -import org.marc.everest.formatters.xml.datatypes.r1.DatatypeFormatter; -import org.marc.everest.formatters.xml.datatypes.r1.R1FormatterCompatibilityMode; -import org.marc.everest.formatters.xml.its1.XmlIts1Formatter; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.LanguageCommunication; -import org.marc.everest.xml.XMLStateStreamWriter; -import org.oscarehr.casemgmt.dao.IssueDAO; -import org.oscarehr.common.dao.DemographicDao; -import org.oscarehr.common.dao.Icd9Dao; -import org.oscarehr.common.dao.MeasurementTypeDao; -import org.oscarehr.common.dao.ProviderDataDao; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.common.model.MeasurementType; -import org.oscarehr.common.model.ProviderData; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Constants.IdPrefixes; -import org.oscarehr.e2e.constant.Constants.TelecomType; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.extension.ObservationWithConfidentialityCode; -import org.oscarehr.util.SpringUtils; - -public class EverestUtils { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - private static final String OSCAR_PREVENTIONITEMS_FILE = "/oscar/oscarPrevention/PreventionItems.xml"; - protected static Map preventionTypeCodes = null; - - public static final Map demographicCache = new HashMap(); - public static final Map providerCache = new HashMap(); - public static final Map icd9DescriptionCache = new HashMap(); - public static final Map measurementTypeCache = new HashMap(); - static { - measurementTypeCache.put("DIAS", "Diastolic Blood Pressure"); - measurementTypeCache.put("SYST", "Systolic Blood Pressure"); - } - - EverestUtils() { - throw new UnsupportedOperationException(); - } - - /** - * General Everest Utility Functions - */ - // Check String for Null, Empty or Whitespace - public static Boolean isNullorEmptyorWhitespace(String obj) { - return obj == null || obj.isEmpty() || obj.trim().isEmpty(); - } - - // Generate Document Function - public static String generateDocumentToString(ClinicalDocument clinicalDocument, Boolean validation) { - if(clinicalDocument == null) { - return null; - } - - StringWriter sw = new StringWriter(); - XmlIts1Formatter fmtr = new XmlIts1Formatter(); - fmtr.setValidateConformance(validation); - fmtr.getGraphAides().add(new DatatypeFormatter(R1FormatterCompatibilityMode.ClinicalDocumentArchitecture)); - fmtr.addCachedClass(ClinicalDocument.class); - fmtr.registerXSITypeName("POCD_MT000040UV.Observation", ObservationWithConfidentialityCode.class); - - try { - XMLOutputFactory fact = XMLOutputFactory.newInstance(); - XMLStateStreamWriter xssw = new XMLStateStreamWriter(fact.createXMLStreamWriter(sw)); - - xssw.writeStartDocument(Constants.XML.ENCODING, Constants.XML.VERSION); - xssw.writeStartElement("hl7", "ClinicalDocument", "urn:hl7-org:v3"); - xssw.writeNamespace("xs", "http://www.w3.org/2001/XMLSchema"); - xssw.writeNamespace("hl7", "urn:hl7-org:v3"); - xssw.writeNamespace("e2e", "http://standards.pito.bc.ca/E2E-DTC/cda"); - xssw.writeAttribute("xmlns", "xsi", "xsi", "http://www.w3.org/2001/XMLSchema-instance"); - xssw.writeAttribute("xsi", "schemaLocation", "schemaLocation", "urn:hl7-org:v3 Schemas/CDA-PITO-E2E.xsd"); - xssw.writeDefaultNamespace("urn:hl7-org:v3"); // Default hl7 namespace - - IFormatterGraphResult details = fmtr.graph(xssw, clinicalDocument); - - xssw.writeEndElement(); - xssw.writeEndDocument(); - xssw.close(); - - String output = prettyFormatXML(sw.toString(), Constants.XML.INDENT); - - // Temporary Everest Bugfixes - output = everestBugFixes(output); - - if(validation) { - E2EEverestValidator.isValidCDA(details); - E2EXSDValidator.isValidXML(output); - } - - return output; - } catch (XMLStreamException e) { - log.error(e.toString()); - } - - return null; - } - - // Temporary Everest Bugfixes - private static String everestBugFixes(String output) { - String result = output.replaceAll("xsi:nil=\"true\" ", ""); - result = result.replaceAll("xsi:type=\"_TS\" ", ""); - return result.replaceAll("delimeter", "delimiter"); - } - - // Pretty Print XML - public static String prettyFormatXML(String input, Integer indent) { - if(!isNullorEmptyorWhitespace(input)) { - try { - Source xmlInput = new StreamSource(new StringReader(input)); - StreamResult xmlOutput = new StreamResult(new StringWriter()); - - Transformer tf = TransformerFactory.newInstance().newTransformer(); - tf.setOutputProperty(OutputKeys.ENCODING, Constants.XML.ENCODING); - tf.setOutputProperty(OutputKeys.INDENT, "yes"); - tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent)); - tf.transform(xmlInput, xmlOutput); - - return xmlOutput.getWriter().toString().replaceFirst(" addrParts, String value, AddressPartType addressPartType) { - if(!isNullorEmptyorWhitespace(value)) { - ADXP addrPart = new ADXP(value, addressPartType); - addrParts.add(addrPart); - } - } - - // Add a telecom element to the telecoms set - public static void addTelecomPart(SET telecoms, String value, TelecommunicationsAddressUse telecomAddressUse, TelecomType telecomType) { - if(!isNullorEmptyorWhitespace(value)) { - if(telecomType == Constants.TelecomType.TELEPHONE) { - telecoms.add(new TEL(Constants.DocumentHeader.TEL_PREFIX + value.replaceAll("-", ""), telecomAddressUse)); - } else if(telecomType == Constants.TelecomType.EMAIL) { - telecoms.add(new TEL(Constants.DocumentHeader.EMAIL_PREFIX + value, telecomAddressUse)); - } - } - } - - // Add a name to the names set - public static void addNamePart(SET names, String firstName, String lastName, EntityNameUse entityNameUse) { - ArrayList name = new ArrayList(); - if(!isNullorEmptyorWhitespace(firstName)) { - name.add(new ENXP(firstName, EntityNamePartType.Given)); - } - if(!isNullorEmptyorWhitespace(lastName)) { - name.add(new ENXP(lastName, EntityNamePartType.Family)); - } - if(!name.isEmpty()) { - names.add(new PN(entityNameUse, name)); - } - } - - // Add a language to the languages list - public static void addLanguagePart(ArrayList languages, String value) { - if(!isNullorEmptyorWhitespace(value) && Mappings.languageCode.containsKey(value)) { - LanguageCommunication language = new LanguageCommunication(); - language.setLanguageCode(Mappings.languageCode.get(value)); - languages.add(language); - } - } - - /** - * Body Utility Functions - */ - // Create Prefix-number id object from integer - public static SET buildUniqueId(IdPrefixes prefix, Integer id) { - if(id == null) { - id = 0; - } - - StringBuilder sb = new StringBuilder(); - sb.append(prefix).append("-").append(id.toString()); - - II ii = new II(Constants.EMR.EMR_OID, sb.toString()); - ii.setAssigningAuthorityName(Constants.EMR.EMR_VERSION); - return new SET(ii); - } - - // Create Prefix-number id object from long - public static SET buildUniqueId(IdPrefixes prefix, Long id) { - if(id == null) { - id = 0L; - } - - StringBuilder sb = new StringBuilder(); - sb.append(prefix).append("-").append(id.toString()); - - II ii = new II(Constants.EMR.EMR_OID, sb.toString()); - ii.setAssigningAuthorityName(Constants.EMR.EMR_VERSION); - return new SET(ii); - } - - // Create a TS object from a Java Date with Day precision - public static TS buildTSFromDate(Date date) { - return buildTSFromDate(date, TS.DAY); - } - - // Create a TS object from a Java Date with specified precision - public static TS buildTSFromDate(Date date, Integer precision) { - if(date == null) { - return null; - } - - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); - return new TS(calendar, precision); - } - - // Create a Date object from dateString - public static Date stringToDate(String dateString) { - String[] formatStrings = {"yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd hh:mm", "yyyy-MM-dd"}; - Integer i = 0; - while(i < formatStrings.length) { - try { - return new SimpleDateFormat(formatStrings[i]).parse(dateString); - } catch (Exception e) { - i++; - } - } - - return null; - } - - /** - * Caching Utility Functions - */ - // Find the provider of a given demographicNo - public static String getDemographicProviderNo(String demographicNo) { - String providerNo = null; - try { - if(!isNullorEmptyorWhitespace(demographicNo) && demographicCache.containsKey(demographicNo)) { - providerNo = demographicCache.get(demographicNo).getProviderNo(); - } else { - DemographicDao demographicDao = SpringUtils.getBean(DemographicDao.class); - Demographic demographic = demographicDao.getDemographic(demographicNo); - demographicCache.put(demographicNo, demographic); - providerNo = demographic.getProviderNo(); - } - } catch (Exception e) { - log.warn("Demographic " + demographicNo + " not found"); - } - - return providerNo; - } - - // Find the provider from providerNo String - public static ProviderData getProviderFromString(String providerNo) { - ProviderData provider = null; - if(!isNullorEmptyorWhitespace(providerNo) && providerCache.containsKey(providerNo)) { - provider = providerCache.get(providerNo); - } else { - ProviderDataDao providerDao = SpringUtils.getBean(ProviderDataDao.class); - try { - provider = providerDao.findByProviderNo(providerNo); - } catch (Exception e) { - log.warn("Provider " + providerNo + " not found"); - } - providerCache.put(providerNo, provider); - } - - return provider; - } - - // Find the description of icd9 code - public static String getICD9Description(String code) { - String description = null; - if(!isNullorEmptyorWhitespace(code) && icd9DescriptionCache.containsKey(code)) { - description = icd9DescriptionCache.get(code); - } else { - Icd9Dao icd9Dao = SpringUtils.getBean(Icd9Dao.class); - try { - description = icd9Dao.findByCode(code).getDescription(); - } catch (Exception e) { - log.warn("ICD9 Code '" + code + "' missing description"); - } - icd9DescriptionCache.put(code, description); - } - - return description; - } - - // Find the description of measurement type - public static String getTypeDescription(String type) { - String description = type; - if(!isNullorEmptyorWhitespace(type) && measurementTypeCache.containsKey(type)) { - description = measurementTypeCache.get(type); - } else { - MeasurementTypeDao measurementTypeDao = SpringUtils.getBean(MeasurementTypeDao.class); - try { - List measurementType = measurementTypeDao.findByType(type); - description = measurementType.get(0).getTypeDescription(); - } catch (Exception e) { - log.warn("Measurement type description '" + type + "' not found"); - } - measurementTypeCache.put(type, description); - } - - return description; - } - - // Find ATC code of prevention type - public static String getPreventionType(String type) { - String code = null; - if(preventionTypeCodes == null) { - preventionTypeCodes = new HashMap(); - try { - InputStream is = EverestUtils.class.getResourceAsStream(OSCAR_PREVENTIONITEMS_FILE); - Element root = new SAXBuilder().build(is).getRootElement(); - @SuppressWarnings("unchecked") - List items = root.getChildren("item"); - for(Element e : items) { - Attribute name = e.getAttribute("name"); - Attribute atc = e.getAttribute("atc"); - if(atc != null && !isNullorEmptyorWhitespace(atc.getValue())) { - preventionTypeCodes.put(name.getValue(), atc.getValue()); - } - } - is.close(); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - } - - if(!isNullorEmptyorWhitespace(type) && preventionTypeCodes.containsKey(type)) { - code = preventionTypeCodes.get(type); - } - - return code; - } - - // Find runtime issueID number - public static Long getIssueID(String issue) { - Long answer = 0L; - IssueDAO issueDao = SpringUtils.getBean(IssueDAO.class); - try { - answer = issueDao.findIssueByCode(issue).getId(); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - return answer; - } -} diff --git a/src/main/java/org/oscarehr/integration/nclass/ReferencedType.java b/src/main/java/org/oscarehr/integration/nclass/ReferencedType.java deleted file mode 100644 index c4f1ab8f9d..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/ReferencedType.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass; - -public @interface ReferencedType { - - String value(); - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/Storyboard.java b/src/main/java/org/oscarehr/integration/nclass/Storyboard.java deleted file mode 100644 index 8a10c2a359..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/Storyboard.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass; - -public @interface Storyboard { - - String value(); - - String name() default ""; -} diff --git a/src/main/java/org/oscarehr/integration/nclass/Storyboards.java b/src/main/java/org/oscarehr/integration/nclass/Storyboards.java deleted file mode 100644 index 29889039e0..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/Storyboards.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass; - -public @interface Storyboards { - - String[] value(); - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensivePlacer.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensivePlacer.java deleted file mode 100644 index c5c916d2c7..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensivePlacer.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry; - -import org.oscarehr.common.model.Demographic; -import org.oscarehr.integration.nclass.ReferencedType; -import org.oscarehr.integration.nclass.Storyboard; - -@Storyboard("PRPA_ST101311CA") -@ReferencedType("PRPA_AR101201CA") -public interface PersonComprehensivePlacer { - - /** - * Adds specified demographic to the registry. - * - * @param demographic - * New demographic to be added to the registry - * - * @see PersonRegistryQueryPlacer - * - * @return - * Returns the external ID assigned withing the registry - */ - public String addPerson(Demographic demographic); - - /** - * Changes the person information in the registry - * - * @param demographic - * Demographic be changed - * - */ - public void revisePerson(Demographic demographic); - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacer.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacer.java deleted file mode 100644 index 54dea269ec..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacer.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry; - -import org.oscarehr.common.model.Demographic; -import org.oscarehr.common.model.Provider; -import org.oscarehr.integration.nclass.ReferencedType; -import org.oscarehr.integration.nclass.Storyboard; -import org.oscarehr.integration.nclass.clientRegistry.model.Candidate; -import org.oscarehr.integration.nclass.clientRegistry.model.PersonDemographics; - -/** - * Enables the source system to place find candidate requests to the client registry. - */ -@Storyboard("PRPA_ST101311CA") -@ReferencedType("PRPA_AR101101CA") -public interface PersonRegistryQueryPlacer { - - /** - * Searches for candidates matching the provided demographic. - * - * @param demographic - * Demographic to find candidate records for. - * @return - * Returns the list of matching registry entries. - */ - public Candidate findCandidate(Provider provider, Demographic demographic); - - /** - * Finds person details based on the client ID - * - * @param demographic - * Demographic to find details for - * @return - * Returns the details or null if it's not available - */ - public PersonDemographics getPersonDemographics(Candidate demographic); - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BaseFulfiller.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BaseFulfiller.java deleted file mode 100644 index efb5d1ce13..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BaseFulfiller.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -public abstract class BaseFulfiller extends GenericPlaceholder { - - public BaseFulfiller() { - super(new Endpoint("Jurisdiction X HIAL", "http://120.120.120.120"), new Endpoint("OSCAR McMaster", "http://110.110.110.110")); - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BasePlacer.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BasePlacer.java deleted file mode 100644 index 2257cafb6c..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/BasePlacer.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -public class BasePlacer extends GenericPlaceholder { - - public BasePlacer() { - super(new Endpoint("OSCAR McMaster", "http://110.110.110.110"), new Endpoint("Jurisdiction X HIAL", "http://120.120.120.120")); - } -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Endpoint.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Endpoint.java deleted file mode 100644 index 2bdfbd6202..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Endpoint.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -public class Endpoint { - - private String url; - private String name; - - public Endpoint() { - } - - public Endpoint(String url, String name) { - super(); - this.url = url; - this.name = name; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/GenericPlaceholder.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/GenericPlaceholder.java deleted file mode 100644 index f61c395ffa..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/GenericPlaceholder.java +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import org.marc.everest.datatypes.EN; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNamePartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.PN; -import org.marc.everest.rmim.ca.r020403.coct_mt090102ca.Person; -import org.oscarehr.common.model.Provider; -//import org.marc.everest.formatters.xml.datatypes.r1.DatatypeFormatter; -//import org.marc.everest.formatters.xml.datatypes.r1.R1FormatterCompatibilityMode; -//import org.marc.everest.formatters.xml.its1.XmlIts1Formatter; -//import org.marc.everest.formatters.xml.its1.XmlIts1FormatterParseResult; -//import java.io.ByteArrayInputStream; -//import java.io.ByteArrayOutputStream; -//import java.io.IOException; -// -//import javax.xml.stream.XMLInputFactory; -//import javax.xml.stream.XMLOutputFactory; -//import javax.xml.stream.XMLStreamException; -//import org.marc.everest.interfaces.IGraphable; -//import org.marc.everest.xml.XMLStateStreamReader; -//import org.marc.everest.xml.XMLStateStreamWriter; -//import org.oscarehr.integration.nclass.clientRegistry.impl.exception.OutputException; - -public abstract class GenericPlaceholder { - - private Endpoint sender; - private Endpoint receiver; - - public GenericPlaceholder(Endpoint sender, Endpoint receiver) { - super(); - this.sender = sender; - this.receiver = receiver; - } - - public Endpoint getSender() { - return sender; - } - - public void setSender(Endpoint sender) { - this.sender = sender; - } - - public Endpoint getReceiver() { - return receiver; - } - - public void setReceiver(Endpoint receiver) { - this.receiver = receiver; - } - - // /** - // * Creates a new ITS formatter with Canadian compatibility model. This - // * formatter does not validate conformance. - // * - // * @return Returns a new formatter instance. - // */ - // protected XmlIts1Formatter newFormatter() { - // XmlIts1Formatter fmtr = new XmlIts1Formatter(); - // DatatypeFormatter dtFormatter = new DatatypeFormatter( - // R1FormatterCompatibilityMode.Canadian); - // fmtr.getGraphAides().add(dtFormatter); - // fmtr.setValidateConformance(false); - // return fmtr; - // } - - // @SuppressWarnings("unchecked") - // protected T getAsMessage(String content, - // Class messageClass) { - // XmlIts1Formatter fmtr = newFormatter(); - // fmtr.addCachedClass(messageClass); - // - // XMLInputFactory xinFact = XMLInputFactory.newInstance(); - // XMLStateStreamReader xsr = null; - // try { - // xsr = new XMLStateStreamReader( - // xinFact.createXMLStreamReader(new ByteArrayInputStream( - // content.getBytes()))); - // XmlIts1FormatterParseResult parseResult = (XmlIts1FormatterParseResult) fmtr - // .parse(xsr); - // return (T) parseResult.getStructure(); - // } catch (Exception e) { - // throw new OutputException("Unable to deserialize content", e); - // } finally { - // fmtr.close(); - // } - // } - - // protected String getAsString(IGraphable iGraphable) { - // XmlIts1Formatter fmtr = newFormatter(); - // ByteArrayOutputStream baos = new ByteArrayOutputStream(); - // XMLOutputFactory xoutFact = XMLOutputFactory.newInstance(); - // XMLStateStreamWriter xsw = null; - // try { - // xsw = new XMLStateStreamWriter(xoutFact.createXMLStreamWriter(baos)); - // fmtr.graph(xsw, iGraphable); - // xsw.flush(); - // xsw.close(); - // baos.flush(); - // return baos.toString(); - // } catch (XMLStreamException e) { - // throw new OutputException("Unable to output XML graph structure", e); - // } catch (IOException e) { - // throw new OutputException( - // "Unable to output the underlying content", e); - // } finally { - // if (fmtr != null) { - // fmtr.close(); - // } - // } - // } - - protected Person getProviderAsPerson(Provider provider) { - if (provider == null) { - return null; - } - - return new Person(PN.fromEN(EN.createEN(EntityNameUse.Legal, new ENXP(provider.getFirstName(), EntityNamePartType.Given), new ENXP(provider.getLastName(), EntityNamePartType.Family))), null); - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensiveFulfiller.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensiveFulfiller.java deleted file mode 100644 index 9454693925..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensiveFulfiller.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import java.util.UUID; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101201CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101202CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101204CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101205CA; -import org.marc.everest.rmim.ca.r020403.vocabulary.AcknowledgementCondition; -import org.marc.everest.rmim.ca.r020403.vocabulary.ProcessingID; -import org.marc.everest.rmim.ca.r020403.vocabulary.ResponseMode; - -public class PlaceholderPersonComprehensiveFulfiller extends BaseFulfiller { - - private static Logger logger = org.oscarehr.util.MiscUtils.getLogger(); - - public PRPA_IN101202CA addPerson(PRPA_IN101201CA query) { - if (query == null) { - logger.debug("Null initial query"); - } - - PRPA_IN101202CA response = new PRPA_IN101202CA(new II(UUID.randomUUID()), TS.now(), ResponseMode.Immediate, PRPA_IN101202CA.defaultInteractionId(), PRPA_IN101202CA.defaultProfileId(), ProcessingID.Training, AcknowledgementCondition.Always); - org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.ControlActEvent controlActEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.ControlActEvent(); - response.setControlActEvent(controlActEvent); - - // PRPA_IN101202CA / controlActEvent / subject / registrationEvent / identifiedEntity / id @ extension & root - org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.Subject2 subject = new org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.Subject2(); - controlActEvent.setSubject(subject); - org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.RegistrationEvent registrationEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.RegistrationEvent(); - subject.setRegistrationEvent(registrationEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.Subject4 anotherSubject = new org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.Subject4(); - registrationEvent.setSubject(anotherSubject); - - org.marc.everest.rmim.ca.r020403.prpa_mt101106ca.IdentifiedEntity identifiedEntity = new org.marc.everest.rmim.ca.r020403.prpa_mt101106ca.IdentifiedEntity(); - anotherSubject.setRegisteredRole(identifiedEntity); - - identifiedEntity.setId(new SET()); - identifiedEntity.getId().add(new II("2.16.840.1.113883.4.57", "444114567")); - - // see if identified person and asOtherIds are necessary - return response; - } - - public PRPA_IN101205CA revisePerson(PRPA_IN101204CA request) { - if (logger.isDebugEnabled()) { - logger.debug("Revising " + request); - } - - PRPA_IN101205CA response = Utils.newInstance(PRPA_IN101205CA.class); - return response; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensivePlacer.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensivePlacer.java deleted file mode 100644 index 62bff054b8..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonComprehensivePlacer.java +++ /dev/null @@ -1,259 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.AD; -import org.marc.everest.datatypes.ADXP; -import org.marc.everest.datatypes.AddressPartType; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CV; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101201CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101202CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101204CA; -import org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person; -import org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.IdOrganization; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.AdministrativeGender; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.PersonBirthtime; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.integration.nclass.clientRegistry.PersonComprehensivePlacer; - -public class PlaceholderPersonComprehensivePlacer extends BasePlacer implements PersonComprehensivePlacer { - - private static Logger logger = org.oscarehr.util.MiscUtils.getLogger(); - - private PlaceholderPersonComprehensiveFulfiller personComprehensiveFulfiller = new PlaceholderPersonComprehensiveFulfiller(); - - @Override - public String addPerson(Demographic demographic) { - PRPA_IN101201CA query = Utils.newInstance(PRPA_IN101201CA.class); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.ControlActEvent controlActEvent = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.ControlActEvent(); - query.setControlActEvent(controlActEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject2 - subject = new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject2(); - controlActEvent.setSubject(subject); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.RegistrationRequest - registrationRequest = new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.RegistrationRequest(); - subject.setRegistrationRequest(registrationRequest); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject4 anotherSubject = new - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject4(); - registrationRequest.setSubject(anotherSubject); - - org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.IdentifiedEntity identifiedEntity = new org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.IdentifiedEntity(); - anotherSubject.setRegisteredRole(identifiedEntity); - - initIdentifiedEntity(identifiedEntity, demographic); - - PRPA_IN101202CA response = personComprehensiveFulfiller.addPerson(query); - if (response == null) { - logger.debug("Null response " + response); - - return null; - } - - // PRPA_IN101202CA / controlActEvent / subject / registrationEvent / identifiedEntity / id @ extension & root - org.marc.everest.rmim.ca.r020403.mfmi_mt700726ca.RegistrationEvent - responseRegistrationEvent = response.getControlActEvent().getSubject().getRegistrationEvent(); - // PRPA_IN101202CA / controlActEvent / subject / registrationEvent / identifiedEntity / id @ extension & root - org.marc.everest.rmim.ca.r020403.prpa_mt101106ca.IdentifiedEntity responseIdentifiedEntity = - responseRegistrationEvent.getSubject().getRegisteredRole(); - - for(II i : responseIdentifiedEntity.getId() ) { - return i.getExtension(); - } - - return null; - } - - private void initIdentifiedEntity(org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.IdentifiedEntity identifiedEntity, Demographic demo) { - org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person person = new org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person(); - identifiedEntity.setIdentifiedPerson(person); - - LIST pns = new LIST(); - PN pn = PN.fromFamilyGiven(EntityNameUse.Legal, demo.getLastName(), demo.getFirstName()); - pns.add(pn); - person.setName(pns); - - LIST tel = new LIST(); - if (demo.getPhone() != null) { - tel.add(new TEL(demo.getPhone())); - } - if (demo.getPhone() != null) { - tel.add(new TEL(demo.getPhone2())); - } - person.setTelecom(tel); - - if ("M".equals(demo.getSex())) { - person.setAdministrativeGenderCode(new CV(org.marc.everest.rmim.ca.r020403.vocabulary.AdministrativeGender.Male)); - } else if ("F".equals(demo.getSex())) { - person.setAdministrativeGenderCode(new CV(org.marc.everest.rmim.ca.r020403.vocabulary.AdministrativeGender.Female)); - } else { - person.setAdministrativeGenderCode(new CV(org.marc.everest.rmim.ca.r020403.vocabulary.AdministrativeGender.Undifferentiated)); - } - - person.setBirthTime(demo.getBirthDay()); - - // FIXME assume we only deal with alive patients - person.setDeceasedInd(new BL(false)); - - LIST addr = new LIST(); - AD ad = new AD(); - ad.getPart().add(new ADXP(demo.getAddress())); - ad.getPart().add(new ADXP(demo.getCity(), AddressPartType.City)); - ad.getPart().add(new ADXP(demo.getProvince(), AddressPartType.State)); - ad.getPart().add(new ADXP(demo.getPostal(), AddressPartType.PostalCode)); - addr.add(ad); - person.setAddr(addr); - - org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs(); - // FIXME get proper root for this ID - will be based on "per clinic" approach - if (demo.getDemographicNo() != null) { - otherId.setId(new II("2.16.840.1.113883.4.50", demo.getDemographicNo().toString())); - } - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - IdOrganization idOrganization = new IdOrganization(); - // FIXME set proper clinic name - idOrganization.setName("OSCAR"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - // FIXME add proper personal relationship handling - /* - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("FTH", "2.16.840.1.113883.5.111"); - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444111234")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Neville", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - */ - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication lang = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication(new CV(demo.getSpokenLanguage(), "2.16.840.1.113883.6.121")); - person.getLanguageCommunication().add(lang); - } - - @Override - public void revisePerson(Demographic demographic) { - PRPA_IN101204CA request = Utils.newInstance(PRPA_IN101204CA.class); - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.ControlActEvent - controlActEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.ControlActEvent(); - request.setControlActEvent(controlActEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject2 subject2 = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject2(); - controlActEvent.setSubject(subject2); - - org.marc.everest.rmim.ca.r020403.prpa_mt101002ca.IdentifiedEntity identifiedEntity = new - org.marc.everest.rmim.ca.r020403.prpa_mt101002ca.IdentifiedEntity(); - identifiedEntity.setIdentifiedPerson(toIdentifiedPerson(demographic)); - identifiedEntity.setId(new SET()); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.RegistrationRequest registrationRequest = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.RegistrationRequest(); - subject2.setRegistrationRequest(registrationRequest); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject4 subject4 = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700711ca.Subject4(); - registrationRequest.setSubject(subject4); - subject4.setRegisteredRole(identifiedEntity); - - personComprehensiveFulfiller.revisePerson(request); - } - - private Person toIdentifiedPerson(Demographic demo) { - Person person = new Person(); - - String first = demo.getFirstName(); - String last = demo.getLastName(); - AdministrativeGender gender = new AdministrativeGender(Utils.toAdminGender(demo.getSex())); - - PersonBirthtime birthTime = new PersonBirthtime(new TS(demo.getBirthDay())); - if (gender != null && gender.getValue() != null && gender.getValue().getCode() != null) { - person.setAdministrativeGenderCode(new CV(gender.getValue().getCode())); - } - if (birthTime != null && birthTime.getValue() != null) { - person.setBirthTime(birthTime.getValue().getDateValue()); - } - - LIST pns = new LIST(); - PN pn = PN.fromFamilyGiven(EntityNameUse.Legal, last, first); - pns.add(pn); - person.setName(pns); - - LIST addr = new LIST(); - AD ad = new AD(); - ad.getPart().add(new ADXP(demo.getAddress())); - ad.getPart().add(new ADXP(demo.getCity(), AddressPartType.City)); - ad.getPart().add(new ADXP(demo.getProvince(), AddressPartType.State)); - ad.getPart().add(new ADXP(demo.getPostal(), AddressPartType.PostalCode)); - addr.add(ad); - person.setAddr(addr); - - // FIXME - Update to provide the correct info - incl. root and clinic name - org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs(); - otherId.setId(new II("2.16.840.1.113883.4.50", "" + demo.getDemographicNo())); - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - IdOrganization idOrganization = new IdOrganization(); - idOrganization.setName("OSCAR McMaster"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - - /* - // FIXME provide proper relationships - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("FTH", "2.16.840.1.113883.5.111"); - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444111234")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Neville", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - - personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("MTH", "2.16.840.1.113883.5.111"); - parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444112345")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Nelda", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - */ - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication lang = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication(new CV("en", "2.16.840.1.113883.6.121")); - person.getLanguageCommunication().add(lang); - return person; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryFulfiller.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryFulfiller.java deleted file mode 100644 index fb6d839519..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryFulfiller.java +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import java.util.Calendar; -import java.util.List; -import java.util.UUID; - -import org.marc.everest.datatypes.AD; -import org.marc.everest.datatypes.ADXP; -import org.marc.everest.datatypes.AddressPartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CV; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101004CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101101CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101102CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101103CA; -import org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.IdOrganization; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.AdministrativeGender; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.PersonBirthtime; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.PersonName; -import org.marc.everest.rmim.ca.r020403.quqi_mt120008ca.QueryByParameter; -import org.marc.everest.rmim.ca.r020403.vocabulary.AcknowledgementCondition; -import org.marc.everest.rmim.ca.r020403.vocabulary.ProcessingID; -import org.marc.everest.rmim.ca.r020403.vocabulary.ResponseMode; - -/** - * "Dummy" placeholder implementation that should be replaced by the actual registry. - * - */ -public class PlaceholderPersonRegistryQueryFulfiller extends BaseFulfiller { - - public PRPA_IN101004CA findCandidates(PRPA_IN101103CA query) { - org.marc.everest.rmim.ca.r020403.mfmi_mt700751ca.ControlActEvent event = query.getControlActEvent(); - - // Get request information - AdministrativeGender gender = event.getQueryByParameter().getParameterList().getAdministrativeGender(); - PersonBirthtime birthTime = event.getQueryByParameter().getParameterList().getPersonBirthtime(); - - List personNameList = query.getControlActEvent().getQueryByParameter().getParameterList().getPersonName(); - - org.marc.everest.rmim.ca.r020403.prpa_mt101002ca.IdentifiedEntity entity = new org.marc.everest.rmim.ca.r020403.prpa_mt101002ca.IdentifiedEntity(); - for (PersonName personName : personNameList) { - String first = personName.getValue().getPart(0).getValue(); - String last = personName.getValue().getPart(1).getValue(); - - entity.setIdentifiedPerson(toIdentifiedPerson(first, last, gender, birthTime)); - break; - } - - // Create dummy response - PRPA_IN101004CA response = new PRPA_IN101004CA(new II(UUID.randomUUID()), TS.now(), - ResponseMode.Immediate, PRPA_IN101004CA.defaultInteractionId(), PRPA_IN101004CA.defaultProfileId(), - ProcessingID.Training, AcknowledgementCondition.Always); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.ControlActEvent controlActEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.ControlActEvent(); - response.setControlActEvent(controlActEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.Subject2 identifiedSubject = new org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.Subject2(); - controlActEvent.setSubject(identifiedSubject); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.RegistrationEvent registrationEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.RegistrationEvent(); - identifiedSubject.setRegistrationEvent(registrationEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.Subject4 subject = new org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.Subject4(); - registrationEvent.setSubject(subject); - subject.setRegisteredRole(entity); - - org.marc.everest.rmim.ca.r020403.repc_mt000007ca.Custodian custodian = new org.marc.everest.rmim.ca.r020403.repc_mt000007ca.Custodian(); - org.marc.everest.rmim.ca.r020403.coct_mt090310ca.AssignedDevice assignedDevice = new org.marc.everest.rmim.ca.r020403.coct_mt090310ca.AssignedDevice(); - assignedDevice.setId(new II("2.16.840.1.113883.19.3.77.18", "BUS")); - custodian.setAssignedDevice(assignedDevice); - - registrationEvent.setCustodian(custodian); - return response; - } - - private org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person toIdentifiedPerson(String first, String last, AdministrativeGender gender, PersonBirthtime birthTime) { - org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person person = new org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person(); - - if (gender != null && gender.getValue() != null && gender.getValue().getCode() != null) { - person.setAdministrativeGenderCode(new CV(gender.getValue().getCode())); - } - if (birthTime != null && birthTime.getValue() != null) { - person.setBirthTime(birthTime.getValue().getDateValue()); - } - - LIST pns = new LIST(); - PN pn = PN.fromFamilyGiven(EntityNameUse.Legal, last, first); - pns.add(pn); - person.setName(pns); - - LIST addr = new LIST(); - AD ad = new AD(); - ad.getPart().add(new ADXP("1532 Home Street")); - ad.getPart().add(new ADXP("Ann Arbor", AddressPartType.City)); - ad.getPart().add(new ADXP("MI", AddressPartType.State)); - ad.getPart().add(new ADXP("99999", AddressPartType.PostalCode)); - addr.add(ad); - person.setAddr(addr); - - org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs(); - // generate dummy UUID - otherId.setId(new II("2.16.840.1.113883.4.50", UUID.randomUUID().toString())); - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - IdOrganization idOrganization = new IdOrganization(); - idOrganization.setName("Department of National Defence"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs(); - // generate dummy UUID - otherId.setId(new II("2.16.840.1.113883.4.50", UUID.randomUUID().toString())); - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - idOrganization = new IdOrganization(); - idOrganization.setName("British Columbia Ministry of Transportation"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("FTH", "2.16.840.1.113883.5.111"); - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444111234")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Neville", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - - personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("MTH", "2.16.840.1.113883.5.111"); - parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444112345")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Nelda", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication lang = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication(new CV("en", "2.16.840.1.113883.6.121")); - person.getLanguageCommunication().add(lang); - - return person; - } - - static org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.Person toAnotherIdentifiedPerson(String first, String last, AdministrativeGender gender, PersonBirthtime birthTime) { - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.Person person = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.Person(); - - if (gender != null && gender.getValue() != null && gender.getValue().getCode() != null) { - person.setAdministrativeGenderCode(new CV(gender.getValue().getCode())); - } - if (birthTime != null && birthTime.getValue() != null) { - person.setBirthTime(birthTime.getValue().getDateValue()); - } - - LIST pns = new LIST(); - PN pn = PN.fromFamilyGiven(EntityNameUse.Legal, last, first); - pns.add(pn); - person.setName(pns); - - LIST addr = new LIST(); - AD ad = new AD(); - ad.getPart().add(new ADXP("1532 Home Street")); - ad.getPart().add(new ADXP("Ann Arbor", AddressPartType.City)); - ad.getPart().add(new ADXP("MI", AddressPartType.State)); - ad.getPart().add(new ADXP("99999", AddressPartType.PostalCode)); - addr.add(ad); - person.setAddr(addr); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.OtherIDs otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.OtherIDs(); - // generate dummy UUID - otherId.setId(new II("2.16.840.1.113883.4.50", UUID.randomUUID().toString())); - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - IdOrganization idOrganization = new IdOrganization(); - idOrganization.setName("Department of National Defence"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - otherId = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.OtherIDs(); - // generate dummy UUID - otherId.setId(new II("2.16.840.1.113883.4.50", UUID.randomUUID().toString())); - otherId.setCode(new CV("DL", "2.16.840.1.113883.2.20.5.2")); - idOrganization = new IdOrganization(); - idOrganization.setName("British Columbia Ministry of Transportation"); - otherId.setAssigningIdOrganization(idOrganization); - person.getAsOtherIDs().add(otherId); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("FTH", "2.16.840.1.113883.5.111"); - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444111234")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Neville", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - - personalRelationship = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.PersonalRelationship(); - personalRelationship.setCode("MTH", "2.16.840.1.113883.5.111"); - parentPerson = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.ParentPerson(); - parentPerson.setId(new II("2.16.840.1.113883.4.57", "444112345")); - parentPerson.setName(PN.fromFamilyGiven(EntityNameUse.Legal, "Nelda", "Johnson")); - personalRelationship.setRelationshipHolder(parentPerson); - person.getPersonalRelationship().add(personalRelationship); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication lang = new org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.LanguageCommunication(new CV("en", "2.16.840.1.113883.6.121")); - person.getLanguageCommunication().add(lang); - - return person; - } - - public PRPA_IN101102CA findPersonDemographic(PRPA_IN101101CA request) { - PRPA_IN101102CA response = new PRPA_IN101102CA(new II(UUID.randomUUID()), TS.now(), - ResponseMode.Immediate, PRPA_IN101102CA.defaultInteractionId(), PRPA_IN101102CA.defaultProfileId(), - ProcessingID.Training, AcknowledgementCondition.Always); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.ControlActEvent - controlActEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.ControlActEvent(); - response.setControlActEvent(controlActEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.Subject2 subject2 = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.Subject2(); - controlActEvent.getSubject().add(subject2); - - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.IdentifiedEntity identifiedEntity = new - org.marc.everest.rmim.ca.r020403.prpa_mt101102ca.IdentifiedEntity(); - AdministrativeGender adminGender = new AdministrativeGender(); - adminGender.setValue(org.marc.everest.rmim.ca.r020403.vocabulary.AdministrativeGender.Undifferentiated); - identifiedEntity.setIdentifiedPerson(toAnotherIdentifiedPerson("First", "Last", adminGender, new PersonBirthtime(new TS(Calendar.getInstance())))); - identifiedEntity.setId(new SET()); - // II id = new II(request.getControlActEvent().getId().getRoot(), request.getControlActEvent().getId().getExtension()); - identifiedEntity.getId().add(request.getControlActEvent().getQueryByParameter().getParameterList().getClientIDBus().getValue()); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.RegistrationEvent registrationEvent = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.RegistrationEvent(); - subject2.setRegistrationEvent(registrationEvent); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.Subject4 subject4 = - new org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.Subject4(); - registrationEvent.setSubject(subject4); - - subject4.setRegisteredRole(identifiedEntity); - - QueryByParameter queryByParameter = - new QueryByParameter(); - controlActEvent.setQueryByParameter(queryByParameter); - - org.marc.everest.rmim.ca.r020403.prpa_mt101101ca.ParameterList paramList = new org.marc.everest.rmim.ca.r020403.prpa_mt101101ca.ParameterList(); - queryByParameter.setParameterList(paramList); - - - paramList.setClientIDBus(request.getControlActEvent().getQueryByParameter().getParameterList().getClientIDBus()); - return response; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryPlacer.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryPlacer.java deleted file mode 100644 index aa130942ed..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/PlaceholderPersonRegistryQueryPlacer.java +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import java.util.UUID; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.EN; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNamePartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.ca.r020403.coct_mt090102ca.AssignedEntity; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101004CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101101CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101102CA; -import org.marc.everest.rmim.ca.r020403.interaction.PRPA_IN101103CA; -import org.marc.everest.rmim.ca.r020403.mcci_mt002200ca.Device1; -import org.marc.everest.rmim.ca.r020403.mcci_mt002200ca.Device2; -import org.marc.everest.rmim.ca.r020403.mcci_mt002200ca.Receiver; -import org.marc.everest.rmim.ca.r020403.mcci_mt002200ca.Sender; -import org.marc.everest.rmim.ca.r020403.mfmi_mt700751ca.Author; -import org.marc.everest.rmim.ca.r020403.mfmi_mt700751ca.ControlActEvent; -import org.marc.everest.rmim.ca.r020403.prpa_mt101101ca.ClientIDBus; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.ParameterList; -import org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.PersonName; -import org.marc.everest.rmim.ca.r020403.quqi_mt120008ca.QueryByParameter; -import org.marc.everest.rmim.ca.r020403.vocabulary.AcknowledgementCondition; -import org.marc.everest.rmim.ca.r020403.vocabulary.ProcessingID; -import org.marc.everest.rmim.ca.r020403.vocabulary.QueryRequestLimit; -import org.marc.everest.rmim.ca.r020403.vocabulary.ResponseMode; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.common.model.Provider; -import org.oscarehr.integration.nclass.clientRegistry.PersonRegistryQueryPlacer; -import org.oscarehr.integration.nclass.clientRegistry.model.Candidate; -import org.oscarehr.integration.nclass.clientRegistry.model.PersonDemographics; - -public class PlaceholderPersonRegistryQueryPlacer extends BasePlacer implements PersonRegistryQueryPlacer { - - private static Logger logger = org.oscarehr.util.MiscUtils.getLogger(); - - private PlaceholderPersonRegistryQueryFulfiller placeholderPersonRegistryQueryFulfiller = new PlaceholderPersonRegistryQueryFulfiller(); - - @Override - public Candidate findCandidate(Provider provider, Demographic demographic) { - PRPA_IN101103CA findCandidates = toQuery(provider, demographic); - PRPA_IN101004CA foundCandidates = placeholderPersonRegistryQueryFulfiller.findCandidates(findCandidates); - Candidate result = fromResponse(foundCandidates); - return result; - } - - private Candidate fromResponse(PRPA_IN101004CA response) { - Candidate result = new Candidate(); - - try { - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.ControlActEvent controlActEvent = response.getControlActEvent(); - - org.marc.everest.rmim.ca.r020403.mfmi_mt700717ca.Subject4 subject = controlActEvent.getSubject().getRegistrationEvent().getSubject(); - - org.marc.everest.rmim.ca.r020403.prpa_mt101001ca.Person person = subject.getRegisteredRole().getIdentifiedPerson(); - if (person.getName() != null && !person.getName().isEmpty()) { - LIST nameList = person.getName(); - PN name = nameList.get(0); - - if (name != null && !name.getParts().isEmpty()) { - result.setFirst(name.getPart(0).getValue()); - result.setLast(name.getPart(1).getValue()); - } - } - - for (org.marc.everest.rmim.ca.r020403.prpa_mt101104ca.OtherIDs oid : person.getAsOtherIDs()) { - result.addId(oid.getId().getExtension(), oid.getAssigningIdOrganization().getName().getValue()); - } - } catch (Exception e) { - logger.warn("Unable to extract expected information from response", e); - } - - return result; - } - - /** - * Creates new query instance - * - * @param demographic - * Demographic to create query for - * @return Returns the new query - */ - private PRPA_IN101103CA toQuery(Provider provider, Demographic demographic) { - PRPA_IN101103CA findCandidates = new PRPA_IN101103CA(new II(UUID.randomUUID()), // II.TOKEN in pCS - TS.now(), ResponseMode.Immediate, PRPA_IN101103CA.defaultInteractionId(), PRPA_IN101103CA.defaultProfileId(), ProcessingID.Training, AcknowledgementCondition.Always); - - // Setup sender - findCandidates.setSender(new Sender( - new TEL(getSender().getUrl()), - new Device1(new II("1.3.6.1.4.1.33349.3.1.1.22", getSender().getName()), - new ST(getSender().getName()), - new ST(getSender().getName()), - null, - null, - null - ))); - - findCandidates.setReceiver(new Receiver(new TEL(getReceiver().getUrl()), - new Device2( - new II("1.3.6.1.4.1.33349.3.1.1.2", "CR") - ) - )); - - // Setup request - findCandidates.setControlActEvent(new ControlActEvent()); - findCandidates.getControlActEvent().setCode(PRPA_IN101103CA.defaultTriggerEvent()); - findCandidates.getControlActEvent().setEffectiveTime(TS.now()); - - // Add author data - if (provider != null) { - findCandidates.getControlActEvent().setAuthor(new Author(TS.now())); - findCandidates.getControlActEvent().getAuthor().setAuthorPerson(new AssignedEntity(SET.createSET(new II("1.2.3.4", "FS-39485")), getProviderAsPerson(provider))); - } - - // Query control data - findCandidates.getControlActEvent().setQueryByParameter(new QueryByParameter()); - findCandidates.getControlActEvent().getQueryByParameter().setQueryId(UUID.randomUUID()); - findCandidates.getControlActEvent().getQueryByParameter().setInitialQuantity(10); - findCandidates.getControlActEvent().getQueryByParameter().setInitialQuantityCode(QueryRequestLimit.Record); - - // Parameter list - findCandidates.getControlActEvent().getQueryByParameter().setParameterList(new ParameterList()); - findCandidates.getControlActEvent().getQueryByParameter().getParameterList().setAdministrativeGender(new org.marc.everest.rmim.ca.r020403.prpa_mt101103ca.AdministrativeGender(Utils.toAdminGender(demographic.getSex()))); - findCandidates.getControlActEvent().getQueryByParameter().getParameterList().getPersonName().add(new PersonName(PN.fromEN(EN.createEN(EntityNameUse.Search, new ENXP(demographic.getFirstName(), EntityNamePartType.Given), new ENXP(demographic.getLastName(), EntityNamePartType.Family))))); - return findCandidates; - } - - @Override - public PersonDemographics getPersonDemographics(Candidate candidate) { - if (candidate.getIds().isEmpty()) { - return null; - } - - PRPA_IN101101CA request = new PRPA_IN101101CA(new II(UUID.randomUUID()), // II.TOKEN in pCS - TS.now(), ResponseMode.Immediate, PRPA_IN101101CA.defaultInteractionId(), - PRPA_IN101101CA.defaultProfileId(), ProcessingID.Training, AcknowledgementCondition.Always); - org.marc.everest.rmim.ca.r020403.mfmi_mt700751ca.ControlActEvent - controlActEvent = new org.marc.everest.rmim.ca.r020403.mfmi_mt700751ca.ControlActEvent(); - request.setControlActEvent(controlActEvent); - - org.marc.everest.rmim.ca.r020403.quqi_mt120008ca.QueryByParameter - queryByParameter = new org.marc.everest.rmim.ca.r020403.quqi_mt120008ca.QueryByParameter(); - controlActEvent.setQueryByParameter(queryByParameter); - org.marc.everest.rmim.ca.r020403.prpa_mt101101ca.ParameterList parameterList = new org.marc.everest.rmim.ca.r020403.prpa_mt101101ca.ParameterList(); - parameterList.setClientIDBus(new ClientIDBus(new II("2.16.840.1.113883.4.57", candidate.getIds().get(0).getId()))); - queryByParameter.setParameterList(parameterList); - - PRPA_IN101102CA personDemographics = placeholderPersonRegistryQueryFulfiller.findPersonDemographic(request); - if (personDemographics.getControlActEvent().getSubject().isEmpty()) { - return null; - } - - org.marc.everest.rmim.ca.r020403.mfmi_mt700746ca.Subject4 - subject = personDemographics.getControlActEvent().getSubject().get(0).getRegistrationEvent().getSubject(); - - String first = subject.getRegisteredRole().getIdentifiedPerson().getName().get(0).getPart(0).getValue(); - String last = subject.getRegisteredRole().getIdentifiedPerson().getName().get(0).getPart(1).getValue(); - String id = subject.getRegisteredRole().getId().get(0).getExtension(); - - return new PersonDemographics(null, first, last, id); - } -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Utils.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Utils.java deleted file mode 100644 index 2b0f03e8af..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/Utils.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.UUID; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.rmim.ca.r020403.vocabulary.AcknowledgementCondition; -import org.marc.everest.rmim.ca.r020403.vocabulary.AdministrativeGender; -import org.marc.everest.rmim.ca.r020403.vocabulary.ProcessingID; -import org.marc.everest.rmim.ca.r020403.vocabulary.ResponseMode; - -public class Utils { - - public static AdministrativeGender toAdminGender(String sex) { - if (sex == null || sex.isEmpty()) { - return AdministrativeGender.Undifferentiated; - } - - if (sex.charAt(0) == 'M' || sex.charAt(0) == 'm') { - return AdministrativeGender.Male; - } - - if (sex.charAt(0) == 'F' || sex.charAt(0) == 'f') { - return AdministrativeGender.Female; - } - - return AdministrativeGender.Undifferentiated; - } - - @SuppressWarnings("unchecked") - public static T newInstance(Class type) { - Method method = null; - try { - ResponseMode responseMode = ResponseMode.Immediate; - - method = type.getDeclaredMethod("defaultInteractionId", new Class[] {}); - II defaultInteractionId = (II) method.invoke(null, (Object[]) new Class[] {}); - - method = type.getDeclaredMethod("defaultProfileId", new Class[] {}); - LIST defaultProfileId = (LIST) method.invoke(null, (Object[]) new Class[] {}); - - ProcessingID processingId = ProcessingID.Training; - AcknowledgementCondition acknowledgementCondition = AcknowledgementCondition.Always; - - Constructor constructor = - type.getConstructor(II.class, TS.class, ResponseMode.class, II.class, LIST.class, ProcessingID.class, AcknowledgementCondition.class); - - return constructor.newInstance(new II(UUID.randomUUID()), TS.now(), responseMode, defaultInteractionId, defaultProfileId, processingId, acknowledgementCondition); - } catch (Exception e) { - throw new RuntimeException("Unable to instantiate " + type.getName(), e); - } - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/exception/OutputException.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/exception/OutputException.java deleted file mode 100644 index 4893e5715e..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/impl/exception/OutputException.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.impl.exception; - -public class OutputException extends RuntimeException { - - private static final long serialVersionUID = 1L; - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Candidate.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Candidate.java deleted file mode 100644 index 08c3d38ba7..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Candidate.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.model; - -import java.util.ArrayList; -import java.util.List; - -public class Candidate { - - private String first; - - private String last; - - private List ids = new ArrayList(); - - public List getIds() { - return ids; - } - - public void setIds(List ids) { - this.ids = ids; - } - - public boolean addId(String id, String source) { - return addId(new Identifier(id, source)); - } - - public boolean addId(Identifier id) { - if (!ids.contains(id)) { - return ids.add(id); - } - return false; - } - - public String getFirst() { - return first; - } - - public void setFirst(String first) { - this.first = first; - } - - public String getLast() { - return last; - } - - public void setLast(String last) { - this.last = last; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Identifier.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Identifier.java deleted file mode 100644 index 63e9c31b55..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/Identifier.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.model; - -public class Identifier { - - private String source; - private String id; - - public Identifier(String id, String source) { - super(); - this.source = source; - this.id = id; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - -} diff --git a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/PersonDemographics.java b/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/PersonDemographics.java deleted file mode 100644 index d107b11cca..0000000000 --- a/src/main/java/org/oscarehr/integration/nclass/clientRegistry/model/PersonDemographics.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry.model; - -public class PersonDemographics { - - private String prefix; - private String first; - private String last; - private String id; - - public PersonDemographics(String prefix, String first, String last, String id) { - super(); - this.prefix = prefix; - this.first = first; - this.last = last; - this.id = id; - } - - public PersonDemographics() { - } - - public String getPrefix() { - return prefix; - } - - public void setPrefix(String prefix) { - this.prefix = prefix; - } - - public String getFirst() { - return first; - } - - public void setFirst(String first) { - this.first = first; - } - - public String getLast() { - return last; - } - - public void setLast(String last) { - this.last = last; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - -} diff --git a/src/main/java/oscar/oscarDemographic/pageUtil/DemographicExportAction4.java b/src/main/java/oscar/oscarDemographic/pageUtil/DemographicExportAction4.java index a3f17f626e..06a2bbfbbe 100644 --- a/src/main/java/oscar/oscarDemographic/pageUtil/DemographicExportAction4.java +++ b/src/main/java/oscar/oscarDemographic/pageUtil/DemographicExportAction4.java @@ -75,8 +75,8 @@ import org.oscarehr.common.model.Hl7TextMessage; import org.oscarehr.common.model.PartialDate; import org.oscarehr.common.model.Provider; -import org.oscarehr.e2e.director.E2ECreator; -import org.oscarehr.e2e.util.EverestUtils; +//import org.oscarehr.e2e.director.E2ECreator; +//import org.oscarehr.e2e.util.EverestUtils; import org.oscarehr.hospitalReportManager.dao.HRMDocumentCommentDao; import org.oscarehr.hospitalReportManager.dao.HRMDocumentDao; import org.oscarehr.hospitalReportManager.dao.HRMDocumentToDemographicDao; @@ -2125,106 +2125,108 @@ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServlet //Util.cleanFiles(files); } break; - case E2E: - if (!Util.checkDir(tmpDir)) { - logger.debug("Error! Cannot write to TMP_DIR - Check oscar.properties or dir permissions."); - } else { - ArrayList files = new ArrayList(); - StringBuilder exportLog = new StringBuilder(); - for (String demoNo : list) { - if (StringUtils.empty(demoNo)) { - String msg = "Error! No Demographic Number"; - logger.error(msg); - exportLog.append(msg); - continue; - } - - // Populate Clinical Document - ClinicalDocument clinicalDocument = E2ECreator.createEmrConversionDocument(Integer.parseInt(demoNo)); - if(clinicalDocument == null) { - String msg = "[Demo ".concat(demoNo).concat("] Not active or failed to populate"); - logger.info(msg); - exportLog.append(msg); - continue; - } - - // Output Clinical Document as String - String output = EverestUtils.generateDocumentToString(clinicalDocument, true); - - //export file to temp directory - try { - File directory = new File(tmpDir); - if(!directory.exists()){ - throw new Exception("Temporary Export Directory does not exist!"); - } - - //Standard format for xml exported file : Demographic_PatientUniqueID - String expFile = "Demographic_".concat(demoNo); - files.add(new File(directory, expFile+".xml")); - } catch(Exception e) { - logger.error("Error", e); - } -// BufferedWriter out = null; - try(BufferedWriter out = new BufferedWriter(new FileWriter(files.get(files.size()-1)))) { - out.write(output); - } catch (IOException e) { - logger.error("Error", e); - throw new Exception("Cannot write .xml file(s) to export directory.\nPlease check directory permissions."); - } - } - - // Create Export Log - try { - File exportLogFile = new File(files.get(0).getParentFile(), "ExportEvent.log"); - BufferedWriter out = new BufferedWriter(new FileWriter(exportLogFile)); - String pidRange = "Patient ID Range: ".concat(list.get(0)); - pidRange = pidRange.concat("-").concat(list.get(list.size()-1)); - - out.write(pidRange.concat(System.getProperty("line.separator"))); - out.write(System.getProperty("line.separator")); - if(exportLog.toString().length() == 0) { - out.write("Export contains no errors".concat(System.getProperty("line.separator"))); - } else { - out.write(exportLog.toString()); - } - out.close(); - - files.add(exportLogFile); - } catch (IOException e) { - logger.error("Error", e); - throw new Exception("Cannot write .xml file(s) to export directory.\nPlease check directory permissions."); - } - - // Zip all export files - String zipName = files.get(0).getName().replace(".xml", ".zip"); - if (setName!=null) zipName = "export_"+setName.replace(" ","")+"_"+UtilDateUtilities.getToday("yyyyMMddHHmmss")+".zip"; - // if (setName!=null) zipName = "export_"+setName.replace(" ","")+"_"+UtilDateUtilities.getToday("yyyyMMddHHmmss")+".pgp"; - if (!Util.zipFiles(files, zipName, tmpDir)) { - logger.debug("Error! Failed to zip export files"); - } - - // Apply PGP if installed - if (pgpReady.equals("Yes")) { - //PGP encrypt zip file - PGPEncrypt pgp = new PGPEncrypt(); - if (pgp.encrypt(zipName, tmpDir)) { - Util.downloadFile(zipName+".pgp", tmpDir, response); - Util.cleanFile(zipName+".pgp", tmpDir); - ffwd = "success"; - } else { - request.getSession().setAttribute("pgp_ready", "No"); - } - } else { - logger.info("Warning: PGP Encryption NOT available - unencrypted file exported!"); - Util.downloadFile(zipName, tmpDir, response); - ffwd = "success"; - } - // Remove zip & export files from temp dir - Util.cleanFile(zipName, tmpDir); - Util.cleanFiles(files); - } - break; + // Remove unused E2E tools. +// case E2E: +// if (!Util.checkDir(tmpDir)) { +// logger.debug("Error! Cannot write to TMP_DIR - Check oscar.properties or dir permissions."); +// } else { +// ArrayList files = new ArrayList(); +// StringBuilder exportLog = new StringBuilder(); +// for (String demoNo : list) { +// if (StringUtils.empty(demoNo)) { +// String msg = "Error! No Demographic Number"; +// logger.error(msg); +// exportLog.append(msg); +// continue; +// } +// +// // Populate Clinical Document +// ClinicalDocument clinicalDocument = E2ECreator.createEmrConversionDocument(Integer.parseInt(demoNo)); +// if(clinicalDocument == null) { +// String msg = "[Demo ".concat(demoNo).concat("] Not active or failed to populate"); +// logger.info(msg); +// exportLog.append(msg); +// continue; +// } +// +// // Output Clinical Document as String +// String output = EverestUtils.generateDocumentToString(clinicalDocument, true); +// +// //export file to temp directory +// try { +// File directory = new File(tmpDir); +// if(!directory.exists()){ +// throw new Exception("Temporary Export Directory does not exist!"); +// } +// +// //Standard format for xml exported file : Demographic_PatientUniqueID +// String expFile = "Demographic_".concat(demoNo); +// files.add(new File(directory, expFile+".xml")); +// } catch(Exception e) { +// logger.error("Error", e); +// } +//// BufferedWriter out = null; +// try(BufferedWriter out = new BufferedWriter(new FileWriter(files.get(files.size()-1)))) { +// out.write(output); +// } catch (IOException e) { +// logger.error("Error", e); +// throw new Exception("Cannot write .xml file(s) to export directory.\nPlease check directory permissions."); +// } +// } +// +// // Create Export Log +// try { +// File exportLogFile = new File(files.get(0).getParentFile(), "ExportEvent.log"); +// BufferedWriter out = new BufferedWriter(new FileWriter(exportLogFile)); +// String pidRange = "Patient ID Range: ".concat(list.get(0)); +// pidRange = pidRange.concat("-").concat(list.get(list.size()-1)); +// +// out.write(pidRange.concat(System.getProperty("line.separator"))); +// out.write(System.getProperty("line.separator")); +// if(exportLog.toString().length() == 0) { +// out.write("Export contains no errors".concat(System.getProperty("line.separator"))); +// } else { +// out.write(exportLog.toString()); +// } +// out.close(); +// +// files.add(exportLogFile); +// } catch (IOException e) { +// logger.error("Error", e); +// throw new Exception("Cannot write .xml file(s) to export directory.\nPlease check directory permissions."); +// } +// +// // Zip all export files +// String zipName = files.get(0).getName().replace(".xml", ".zip"); +// if (setName!=null) zipName = "export_"+setName.replace(" ","")+"_"+UtilDateUtilities.getToday("yyyyMMddHHmmss")+".zip"; +// // if (setName!=null) zipName = "export_"+setName.replace(" ","")+"_"+UtilDateUtilities.getToday("yyyyMMddHHmmss")+".pgp"; +// if (!Util.zipFiles(files, zipName, tmpDir)) { +// logger.debug("Error! Failed to zip export files"); +// } +// +// // Apply PGP if installed +// if (pgpReady.equals("Yes")) { +// //PGP encrypt zip file +// PGPEncrypt pgp = new PGPEncrypt(); +// if (pgp.encrypt(zipName, tmpDir)) { +// Util.downloadFile(zipName+".pgp", tmpDir, response); +// Util.cleanFile(zipName+".pgp", tmpDir); +// ffwd = "success"; +// } else { +// request.getSession().setAttribute("pgp_ready", "No"); +// } +// } else { +// logger.info("Warning: PGP Encryption NOT available - unencrypted file exported!"); +// Util.downloadFile(zipName, tmpDir, response); +// ffwd = "success"; +// } +// +// // Remove zip & export files from temp dir +// Util.cleanFile(zipName, tmpDir); +// Util.cleanFiles(files); +// } +// break; default: break; } diff --git a/src/main/resources/applicationContextE2E.xml b/src/main/resources/applicationContextE2E.xml deleted file mode 100644 index e4cec0dfb6..0000000000 --- a/src/main/resources/applicationContextE2E.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/test/java/org/oscarehr/e2e/constant/ConstantsTest.java b/src/test/java/org/oscarehr/e2e/constant/ConstantsTest.java deleted file mode 100644 index 088af1865a..0000000000 --- a/src/test/java/org/oscarehr/e2e/constant/ConstantsTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.constant; - -import org.junit.Test; -import org.oscarehr.e2e.constant.BodyConstants; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; - -public class ConstantsTest { - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void bodyConstantsInstantiationTest() { - new BodyConstants(); - } - - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void constantsInstantiationTest() { - new Constants(); - } - - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void mappingsInstantiationTest() { - new Mappings(); - } -} diff --git a/src/test/java/org/oscarehr/e2e/director/E2ECreatorTest.java b/src/test/java/org/oscarehr/e2e/director/E2ECreatorTest.java deleted file mode 100644 index 719be291ea..0000000000 --- a/src/test/java/org/oscarehr/e2e/director/E2ECreatorTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.director; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.oscarehr.e2e.constant.Constants; - -public class E2ECreatorTest { - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void instantiationTest() { - new E2ECreator(); - } - - @Test - public void createEmrConversionDocumentTest() { - assertNotNull(E2ECreator.createEmrConversionDocument(Constants.Runtime.VALID_DEMOGRAPHIC)); - } - - @Test - public void emptyCreateEmrConversionDocumentTest() { - assertNotNull(E2ECreator.createEmrConversionDocument(Constants.Runtime.EMPTY_DEMOGRAPHIC)); - } -} diff --git a/src/test/java/org/oscarehr/e2e/director/E2EParserTest.java b/src/test/java/org/oscarehr/e2e/director/E2EParserTest.java deleted file mode 100644 index 74f905905e..0000000000 --- a/src/test/java/org/oscarehr/e2e/director/E2EParserTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.director; - -import org.junit.Test; -import org.oscarehr.e2e.director.E2EParser; - -public class E2EParserTest { - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void instantiationTest() { - new E2EParser(); - } - - @Test(expected=UnsupportedOperationException.class) - public void parseEmrConversionDocumentTest() { - E2EParser.parseEmrConversionDocument(); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/PatientExportTest.java b/src/test/java/org/oscarehr/e2e/model/PatientExportTest.java deleted file mode 100644 index 464bbf036e..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/PatientExportTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model; - -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; - -public class PatientExportTest extends AbstractExportModelTest { - @Test - public void patientExportTest() { - PatientExport patientExport = new PatientExport(Constants.Runtime.VALID_DEMOGRAPHIC); - assertTrue(patientExport.isLoaded()); - } - - @Test - public void emptyPatientExportTest() { - PatientExport patientExport = new PatientExport(Constants.Runtime.EMPTY_DEMOGRAPHIC); - assertTrue(patientExport.isLoaded()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/AbstractExportModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/AbstractExportModelTest.java deleted file mode 100644 index e13c569c75..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/AbstractExportModelTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export; - -import static org.junit.Assert.assertEquals; - -import org.junit.BeforeClass; -import org.oscarehr.common.dao.DaoTestFixtures; -import org.oscarehr.common.dao.utils.SchemaUtils; -import org.oscarehr.e2e.constant.Constants; - -public abstract class AbstractExportModelTest extends DaoTestFixtures { - @BeforeClass - public static void abstractBeforeClass() throws Exception { - SchemaUtils.restoreTable(Constants.Runtime.TABLES); - assertEquals(0, SchemaUtils.loadFileIntoMySQL(Constants.Runtime.E2E_SETUP)); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/AlertsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/AlertsModelTest.java deleted file mode 100644 index 5aa9e80248..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/AlertsModelTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.casemgmt.dao.CaseManagementNoteDAO; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class AlertsModelTest extends AbstractExportModelTest { - public static CaseManagementNoteDAO dao; - public static CaseManagementNote alert; - public static AlertsModel alertsModel; - - public static CaseManagementNote nullAlert; - public static AlertsModel nullAlertsModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(CaseManagementNoteDAO.class); - alert = dao.getNotesByDemographic(Constants.Runtime.VALID_DEMOGRAPHIC.toString()).get(5); - alertsModel = new AlertsModel(alert); - - nullAlert = new CaseManagementNote(); - nullAlertsModel = new AlertsModel(nullAlert); - } - - @Test - public void alertsModelNullTest() { - assertNotNull(new AlertsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = alertsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullAlertsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = alertsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Alerts.toString())); - assertTrue(id.getExtension().contains(alert.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullAlertsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = alertsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void codeNullTest() { - CD code = nullAlertsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void textTest() { - ED text = alertsModel.getText(); - assertNotNull(text); - assertEquals(alert.getNote(), new String(text.getData())); - } - - @Test - public void textNullTest() { - ED text = nullAlertsModel.getText(); - assertNotNull(text); - assertTrue(text.isNull()); - assertEquals(NullFlavor.NoInformation, text.getNullFlavor().getCode()); - } - - @Test - public void statusCodeTest() { - ActStatus status = alertsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullAlertsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - } - - @Test - public void effectiveTimeTest() { - IVL ivl = alertsModel.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(alert.getObservation_date()), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = nullAlertsModel.getEffectiveTime(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.NoInformation, ivl.getNullFlavor().getCode()); - } - - @Test - public void confidentialityTest() { - CE confidentiality = alertsModel.getConfidentiality(); - assertNotNull(confidentiality); - assertEquals(x_BasicConfidentialityKind.Normal, confidentiality.getCode()); - } - - @Test - public void confidentialityNullTest() { - CE confidentiality = nullAlertsModel.getConfidentiality(); - assertNotNull(confidentiality); - assertEquals(x_BasicConfidentialityKind.Normal, confidentiality.getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/AllergiesModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/AllergiesModelTest.java deleted file mode 100644 index 6e017fcffa..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/AllergiesModelTest.java +++ /dev/null @@ -1,423 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Before; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.common.dao.AllergyDao; -import org.oscarehr.common.model.Allergy; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class AllergiesModelTest extends AbstractExportModelTest { - public static AllergyDao dao; - public static Allergy allergy; - public static AllergiesModel allergiesModel; - - public static Allergy nullAllergy; - public static AllergiesModel nullAllergiesModel; - - @Before - public void before() { - dao = SpringUtils.getBean(AllergyDao.class); - allergy = dao.findAllergies(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - allergiesModel = new AllergiesModel(allergy); - - nullAllergy = new Allergy(); - nullAllergiesModel = new AllergiesModel(nullAllergy); - } - - @Test - public void allergiesModelNullTest() { - assertNotNull(new AllergiesModel(null)); - } - - @Test - public void textSummaryTest() { - String text = allergiesModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullAllergiesModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = allergiesModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Allergies.toString())); - assertTrue(id.getExtension().contains(allergy.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullAllergiesModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = allergiesModel.getCode(); - assertNotNull(code); - assertEquals("48765-2", code.getCode()); - assertEquals(Constants.CodeSystems.LOINC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.LOINC_NAME, code.getCodeSystemName()); - assertEquals(Constants.CodeSystems.LOINC_VERSION, code.getCodeSystemVersion()); - } - - @Test - public void codeNullTest() { - CD code = nullAllergiesModel.getCode(); - assertNotNull(code); - assertEquals("48765-2", code.getCode()); - assertEquals(Constants.CodeSystems.LOINC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.LOINC_NAME, code.getCodeSystemName()); - assertEquals(Constants.CodeSystems.LOINC_VERSION, code.getCodeSystemVersion()); - } - - @Test - public void statusCodeActiveTest() { - ActStatus status = allergiesModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - } - - @Test - public void statusCodeCompleteTest() { - allergy.setArchived(true); - allergiesModel = new AllergiesModel(allergy); - - ActStatus status = allergiesModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullAllergiesModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - } - - @Test - public void effectiveTimeTest() { - IVL ivl = allergiesModel.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(allergy.getEntryDate()), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = nullAllergiesModel.getEffectiveTime(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.Unknown, ivl.getNullFlavor().getCode()); - } - - @Test - public void allergyObservationTest() { - EntryRelationship entryRelationship = allergiesModel.getAllergyObservation(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getEffectiveTime()); - assertNotNull(observation.getParticipant()); - assertNotNull(observation.getEntryRelationship()); - } - - @Test - public void allergyObservationNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getAllergyObservation(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getEffectiveTime()); - assertNotNull(observation.getParticipant()); - assertNotNull(observation.getEntryRelationship()); - } - - @Test - public void adverseEventCodeTest() { - CD code = allergiesModel.getAdverseEventCode(); - assertNotNull(code); - assertEquals(Mappings.reactionTypeCode.get(allergy.getTypeCode()), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - } - - @Test - public void adverseEventCodeNullTest() { - CD code = nullAllergiesModel.getAdverseEventCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.Unknown, code.getNullFlavor().getCode()); - } - - @Test - public void onsetDateTest() { - IVL ivl = allergiesModel.getOnsetDate(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(allergy.getStartDate()), ivl.getLow()); - } - - @Test - public void onsetDateNullTest() { - IVL ivl = nullAllergiesModel.getOnsetDate(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.Unknown, ivl.getNullFlavor().getCode()); - } - - @Test - public void allergenStructureTest() { - Participant2 provider = nullAllergiesModel.getAllergen().get(0); - assertNotNull(provider); - assertEquals(ParticipationType.Consumable, provider.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, provider.getContextControlCode().getCode()); - - ParticipantRole participantRole = provider.getParticipantRole(); - assertNotNull(participantRole); - assertEquals(Constants.RoleClass.MANU.toString(), participantRole.getClassCode().getCode()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.ManufacturedMaterial, playingEntity.getClassCode().getCode()); - assertNotNull(playingEntity.getCode()); - assertNotNull(playingEntity.getName()); - } - - @Test - public void allergenCodedTest() { - String test = "test"; - allergy.setRegionalIdentifier(test); - allergiesModel = new AllergiesModel(allergy); - - Participant2 provider = allergiesModel.getAllergen().get(0); - assertNotNull(provider); - - PlayingEntity playingEntity = provider.getParticipantRole().getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - - CE code = playingEntity.getCode(); - assertNotNull(code); - assertEquals(test, code.getCode()); - assertEquals(Constants.CodeSystems.DIN_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.DIN_NAME, code.getCodeSystemName()); - } - - @Test - public void allergenUncodedTest() { - Participant2 provider = allergiesModel.getAllergen().get(0); - assertNotNull(provider); - - PlayingEntity playingEntity = provider.getParticipantRole().getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - - CE code = playingEntity.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void allergyGroupTest() { - EntryRelationship entryRelationship = allergiesModel.getAllergenGroup(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getCode()); - assertEquals(Constants.ObservationType.ALRGRP.toString(), observation.getCode().getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, observation.getCode().getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, observation.getCode().getCodeSystemName()); - - assertNotNull(observation.getValue()); - assertTrue(observation.getValue().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getValue().getNullFlavor().getCode()); - } - - @Test - public void allergyGroupNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getAllergenGroup(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getCode()); - assertEquals(Constants.ObservationType.ALRGRP.toString(), observation.getCode().getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, observation.getCode().getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, observation.getCode().getCodeSystemName()); - - assertNotNull(observation.getValue()); - assertTrue(observation.getValue().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getValue().getNullFlavor().getCode()); - } - - @Test - public void lifeStageTest() { - EntryRelationship entryRelationship = allergiesModel.getLifestage(); - assertNotNull(entryRelationship); - } - - @Test - public void lifeStageNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getLifestage(); - assertNull(entryRelationship); - } - - @Test - public void reactionTest() { - EntryRelationship entryRelationship = allergiesModel.getReaction(); - assertNotNull(entryRelationship); - } - - @Test - public void reactionNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getReaction(); - assertNull(entryRelationship); - } - - @Test - public void severityTest() { - EntryRelationship entryRelationship = allergiesModel.getSeverity(); - assertNotNull(entryRelationship); - } - - @Test - public void severityNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getSeverity(); - assertNotNull(entryRelationship); - } - - @Test - public void clinicalStatusTest() { - EntryRelationship entryRelationship = allergiesModel.getClinicalStatus(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getCode()); - assertEquals(Constants.ObservationType.CLINSTAT.toString(), observation.getCode().getCode()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, observation.getCode().getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, observation.getCode().getCodeSystemName()); - - assertNotNull(observation.getText()); - assertTrue(observation.getText().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getText().getNullFlavor().getCode()); - - assertNotNull(observation.getValue()); - assertTrue(observation.getValue().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getValue().getNullFlavor().getCode()); - } - - @Test - public void clinicalStatusNullTest() { - EntryRelationship entryRelationship = nullAllergiesModel.getClinicalStatus(); - assertNotNull(entryRelationship); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getCode()); - assertEquals(Constants.ObservationType.CLINSTAT.toString(), observation.getCode().getCode()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, observation.getCode().getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, observation.getCode().getCodeSystemName()); - - assertNotNull(observation.getText()); - assertTrue(observation.getText().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getText().getNullFlavor().getCode()); - - assertNotNull(observation.getValue()); - assertTrue(observation.getValue().isNull()); - assertEquals(NullFlavor.NoInformation, observation.getValue().getNullFlavor().getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModelTest.java deleted file mode 100644 index a74403e576..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModelTest.java +++ /dev/null @@ -1,326 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.util.ArrayList; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.common.dao.MeasurementDao; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.e2e.constant.BodyConstants.ClinicallyMeasuredObservations; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class ClinicallyMeasuredObservationsModelTest extends AbstractExportModelTest { - public static MeasurementDao dao; - public static Measurement measurement; - public static ClinicallyMeasuredObservationsModel cmoModel; - - public static Measurement nullMeasurement; - public static ClinicallyMeasuredObservationsModel nullCmoModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(MeasurementDao.class); - } - - @Before - public void before() { - measurement = dao.find(Constants.Runtime.VALID_MEASUREMENT); - cmoModel = new ClinicallyMeasuredObservationsModel(measurement); - nullMeasurement = new Measurement(); - nullCmoModel = new ClinicallyMeasuredObservationsModel(nullMeasurement); - } - - @Test - public void clinicallyMeasuredObservationsModelNullTest() { - assertNotNull(new ClinicallyMeasuredObservationsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = cmoModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullCmoModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = cmoModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.ClinicalMeasuredObservations.toString())); - assertTrue(id.getExtension().contains(Constants.Runtime.VALID_MEASUREMENT.toString())); - } - - @Test - public void idNullTest() { - SET ids = nullCmoModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = cmoModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void codeNullTest() { - CD code = nullCmoModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void statusCodeTest() { - ActStatus status = cmoModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullCmoModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void authorTest() { - ArrayList authors = cmoModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - ArrayList authors = nullCmoModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void componentTest() { - assertNotNull(cmoModel.new ComponentObservation().getComponent(measurement)); - componentStructureTestHelper(cmoModel); - } - - @Test - public void componentBPTest() { - measurement.setType(ClinicallyMeasuredObservations.BLOOD_PRESSURE_CODE); - measurement.setDataField("130/85"); - - assertNotNull(cmoModel.new ComponentObservation().getComponent(measurement)); - componentStructureTestHelper(cmoModel); - - assertEquals(2, cmoModel.getComponents().size()); - } - - @Test - public void componentNullTest() { - assertNotNull(nullCmoModel.new ComponentObservation().getComponent(null)); - componentStructureTestHelper(nullCmoModel); - } - - private Observation componentStructureTestHelper(ClinicallyMeasuredObservationsModel model) { - ArrayList components = model.getComponents(); - assertNotNull(components); - assertTrue(components.size() > 0); - - Component4 component = components.get(0); - assertNotNull(component); - assertEquals(ActRelationshipHasComponent.HasComponent, component.getTypeCode().getCode()); - assertTrue(component.getContextConductionInd().toBoolean()); - - Observation observation = component.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - - return observation; - } - - private Observation componentObservationHelper(ClinicallyMeasuredObservationsModel model) { - ArrayList components = model.getComponents(); - Component4 component = components.get(0); - return component.getClinicalStatementIfObservation(); - } - - @Test - public void componentIdTest() { - SET ids = componentObservationHelper(cmoModel).getId(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.ClinicalMeasuredObservations.toString())); - assertTrue(id.getExtension().contains(Constants.Runtime.VALID_MEASUREMENT.toString())); - } - - @Test - public void componentIdNullTest() { - SET ids = componentObservationHelper(nullCmoModel).getId(); - assertNotNull(ids); - } - - @Test - public void componentCodeTest() { - CD code = componentObservationHelper(cmoModel).getCode(); - assertNotNull(code); - assertEquals(Mappings.measurementCodeMap.get(measurement.getType()), code.getCode()); - assertEquals(Constants.CodeSystems.LOINC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.LOINC_NAME, code.getCodeSystemName()); - assertEquals(Constants.CodeSystems.LOINC_VERSION, code.getCodeSystemVersion()); - } - - @Test - public void componentCodeNullTest() { - CD code = componentObservationHelper(nullCmoModel).getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.Unknown, code.getNullFlavor().getCode()); - } - - @Test - public void componentTextTest() { - ED text = componentObservationHelper(cmoModel).getText(); - assertNotNull(text); - assertFalse(new String(text.getData()).isEmpty()); - } - - @Test - public void componentTextNullTest() { - ED text = componentObservationHelper(nullCmoModel).getText(); - assertNull(text); - } - - @Test - public void componentEffectiveTimeTest() { - IVL ivl = componentObservationHelper(cmoModel).getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(measurement.getDateObserved(), TS.SECONDNOTIMEZONE), ivl.getLow()); - } - - @Test - public void componentEffectiveTimeNullTest() { - IVL ivl = componentObservationHelper(nullCmoModel).getEffectiveTime(); - assertNull(ivl); - } - - @Test - public void componentValuePQTest() { - String dataField = measurement.getDataField(); - String unit = Mappings.measurementUnitMap.get(measurement.getType()); - - ANY value = componentObservationHelper(cmoModel).getValue(); - assertNotNull(value); - assertEquals(PQ.class, value.getDataType()); - - PQ pq = (PQ) value; - assertEquals(new BigDecimal(dataField), pq.getValue()); - assertEquals(unit.replaceAll("\\s","_"), pq.getUnit()); - } - - @Test - public void componentValueSTValueUnitTest() { - measurement.setDataField("test"); - String dataField = measurement.getDataField(); - String unit = Mappings.measurementUnitMap.get(measurement.getType()); - - ANY value = componentObservationHelper(cmoModel).getValue(); - assertNotNull(value); - assertEquals(ST.class, value.getDataType()); - - ST st = (ST) value; - assertEquals(dataField.concat(" ").concat(unit), st.getValue()); - } - - @Test - public void componentValueSTValueOnlyTest() { - measurement.setType(null); - String dataField = measurement.getDataField(); - - ANY value = componentObservationHelper(cmoModel).getValue(); - assertNotNull(value); - assertEquals(ST.class, value.getDataType()); - - ST st = (ST) value; - assertEquals(dataField, st.getValue()); - } - - @Test - public void componentValueNullTest() { - ANY value = componentObservationHelper(nullCmoModel).getValue(); - assertNull(value); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/EncountersModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/EncountersModelTest.java deleted file mode 100644 index fd3c9e9d4a..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/EncountersModelTest.java +++ /dev/null @@ -1,211 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.casemgmt.dao.CaseManagementNoteDAO; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class EncountersModelTest extends AbstractExportModelTest { - public static CaseManagementNoteDAO dao; - public static CaseManagementNote encounter; - public static EncountersModel encountersModel; - - public static CaseManagementNote nullEncounter; - public static EncountersModel nullEncountersModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(CaseManagementNoteDAO.class); - encounter = dao.getNotesByDemographic(Constants.Runtime.VALID_DEMOGRAPHIC.toString()).get(0); - encountersModel = new EncountersModel(encounter); - - nullEncounter = new CaseManagementNote(); - nullEncountersModel = new EncountersModel(nullEncounter); - } - - @Test - public void encountersModelNullTest() { - assertNotNull(new EncountersModel(null)); - } - - @Test - public void textSummaryTest() { - String text = encountersModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullEncountersModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = encountersModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Encounters.toString())); - assertTrue(id.getExtension().contains(encounter.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullEncountersModel.getIds(); - assertNotNull(ids); - } - - @Test - public void effectiveTimeTest() { - IVL ivl = encountersModel.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(encounter.getObservation_date()), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = nullEncountersModel.getEffectiveTime(); - assertNull(ivl); - } - - @Test - public void encounterLocationTest() { - Participant2 participant = encountersModel.getEncounterLocation(); - assertNotNull(participant); - assertEquals(ParticipationType.LOC, participant.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, participant.getContextControlCode().getCode()); - - ParticipantRole participantRole = participant.getParticipantRole(); - assertNotNull(participantRole); - assertEquals(Constants.RoleClass.SDLOC.toString(), participantRole.getClassCode().getCode()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.Organization, playingEntity.getClassCode().getCode()); - } - - @Test - public void encounterLocationNullTest() { - Participant2 participant = encountersModel.getEncounterLocation(); - assertNotNull(participant); - assertEquals(ParticipationType.LOC, participant.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, participant.getContextControlCode().getCode()); - - ParticipantRole participantRole = participant.getParticipantRole(); - assertNotNull(participantRole); - assertEquals(Constants.RoleClass.SDLOC.toString(), participantRole.getClassCode().getCode()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.Organization, playingEntity.getClassCode().getCode()); - } - - @Test - public void encounterProviderTest() { - Participant2 participant = encountersModel.getEncounterProvider(); - assertNotNull(participant); - } - - @Test - public void encounterProviderNullTest() { - Participant2 participant = nullEncountersModel.getEncounterProvider(); - assertNotNull(participant); - } - - @Test - public void encounterNoteTest() { - EntryRelationship entryRelationship = encountersModel.getEncounterNote(); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getId()); - assertEquals(encountersModel.getIds(), observation.getId()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.ObservationType.COMMENT.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - - assertNotNull(observation.getEffectiveTime()); - assertEquals(encountersModel.getEffectiveTime(), observation.getEffectiveTime()); - - ANY value = observation.getValue(); - assertNotNull(value); - assertEquals(ST.class, value.getDataType()); - assertNotNull(((ST) value).getValue()); - assertEquals(encounter.getNote().replaceAll("\\\\n", "\n"), ((ST) value).getValue()); - - assertNotNull(observation.getAuthor()); - assertFalse(observation.getAuthor().isEmpty()); - assertEquals(1, observation.getAuthor().size()); - } - - @Test - public void encounterNoteNullTest() { - EntryRelationship entryRelationship = nullEncountersModel.getEncounterNote(); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModelTest.java deleted file mode 100644 index 7374bd338e..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/FamilyHistoryModelTest.java +++ /dev/null @@ -1,340 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.INT; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.RelatedSubject; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Subject; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationTargetSubject; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubject; -import org.oscarehr.casemgmt.dao.CaseManagementNoteDAO; -import org.oscarehr.casemgmt.dao.CaseManagementNoteExtDAO; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.casemgmt.model.CaseManagementNoteExt; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.PatientExport.FamilyHistoryEntry; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class FamilyHistoryModelTest extends AbstractExportModelTest { - public static CaseManagementNoteDAO caseManagementNoteDao; - public static CaseManagementNoteExtDAO caseManagementNoteExtDao; - public static List noteExts; - public static CaseManagementNote familyHistory; - public static FamilyHistoryEntry familyHistoryEntry; - public static FamilyHistoryModel familyHistoryModel; - public static FamilyHistoryModel nullFamilyHistoryModel; - - @BeforeClass - public static void beforeClass() { - caseManagementNoteDao = SpringUtils.getBean(CaseManagementNoteDAO.class); - caseManagementNoteExtDao = SpringUtils.getBean(CaseManagementNoteExtDAO.class); - familyHistory = caseManagementNoteDao.getNotesByDemographic(Constants.Runtime.VALID_DEMOGRAPHIC.toString()).get(2); - noteExts = caseManagementNoteExtDao.getExtByNote(Constants.Runtime.VALID_FAMILY_HISTORY); - } - - @Before - public void before() { - familyHistoryEntry = new FamilyHistoryEntry(familyHistory, noteExts); - familyHistoryModel = new FamilyHistoryModel(familyHistoryEntry); - nullFamilyHistoryModel = new FamilyHistoryModel(new FamilyHistoryEntry(null, null)); - } - - @Test - public void familyHistoryModelNullTest() { - assertNotNull(new FamilyHistoryModel(null)); - } - - @Test - public void textSummaryTest() { - String text = familyHistoryModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullFamilyHistoryModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = familyHistoryModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.FamilyHistory.toString())); - assertTrue(id.getExtension().contains(familyHistoryEntry.getFamilyHistory().getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullFamilyHistoryModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = familyHistoryModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void codeNullTest() { - CD code = nullFamilyHistoryModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void textTest() { - ED text = familyHistoryModel.getText(); - assertNotNull(text); - assertEquals(familyHistoryEntry.getFamilyHistory().getNote(), new String(text.getData())); - } - - @Test - public void textNullTest() { - ED text = nullFamilyHistoryModel.getText(); - assertNull(text); - } - - @Test - public void effectiveTimeTest() { - IVL ivl = familyHistoryModel.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(familyHistoryEntry.getFamilyHistory().getObservation_date()), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = nullFamilyHistoryModel.getEffectiveTime(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.NoInformation, ivl.getNullFlavor().getCode()); - } - - @Test - public void valueTest() { - CD value = familyHistoryModel.getValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @Test - public void valueNullTest() { - CD value = nullFamilyHistoryModel.getValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @Test - public void subjectNormalCodeTest() { - Subject subject = familyHistoryModel.getSubject(); - assertNotNull(subject); - assertEquals(ParticipationTargetSubject.SBJ, subject.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, subject.getContextControlCode().getCode()); - - RelatedSubject relatedSubject = subject.getRelatedSubject(); - assertNotNull(relatedSubject); - assertEquals(x_DocumentSubject.PersonalRelationship, relatedSubject.getClassCode().getCode()); - - CE code = relatedSubject.getCode(); - assertNotNull(code); - assertEquals(Mappings.personalRelationshipRole.get(familyHistoryEntry.getExtMap().get(CaseManagementNoteExt.RELATIONSHIP).toLowerCase()), code.getCode()); - assertEquals(Constants.CodeSystems.ROLE_CODE_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ROLE_CODE_NAME, code.getCodeSystemName()); - assertEquals(familyHistoryEntry.getExtMap().get(CaseManagementNoteExt.RELATIONSHIP), code.getDisplayName()); - } - - @Test - public void subjectOtherCodeTest() { - String test = "test"; - familyHistoryEntry.getExtMap().remove(CaseManagementNoteExt.RELATIONSHIP); - familyHistoryEntry.getExtMap().put(CaseManagementNoteExt.RELATIONSHIP, test); - familyHistoryModel = new FamilyHistoryModel(familyHistoryEntry); - - Subject subject = familyHistoryModel.getSubject(); - assertNotNull(subject); - assertEquals(ParticipationTargetSubject.SBJ, subject.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, subject.getContextControlCode().getCode()); - - RelatedSubject relatedSubject = subject.getRelatedSubject(); - assertNotNull(relatedSubject); - assertEquals(x_DocumentSubject.PersonalRelationship, relatedSubject.getClassCode().getCode()); - - CE code = relatedSubject.getCode(); - assertNotNull(code); - assertEquals("OTH", code.getCode()); - assertEquals(Constants.CodeSystems.ROLE_CODE_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ROLE_CODE_NAME, code.getCodeSystemName()); - assertEquals(test, code.getDisplayName()); - } - - @Test - public void subjectNullTest() { - Subject subject = nullFamilyHistoryModel.getSubject(); - assertNotNull(subject); - assertEquals(ParticipationTargetSubject.SBJ, subject.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, subject.getContextControlCode().getCode()); - - RelatedSubject relatedSubject = subject.getRelatedSubject(); - assertNotNull(relatedSubject); - assertEquals(x_DocumentSubject.PersonalRelationship, relatedSubject.getClassCode().getCode()); - - CE code = relatedSubject.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void treatmentCommentTest() { - EntryRelationship entryRelationship = familyHistoryModel.getTreatmentComment(); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.ObservationType.TRTNOTE.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - - ED text = observation.getText(); - assertNotNull(text); - assertEquals(familyHistoryEntry.getExtMap().get(CaseManagementNoteExt.TREATMENT), new String(text.getData())); - - assertEquals(CD.class, observation.getValue().getDataType()); - ANY value = observation.getValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.NoInformation, value.getNullFlavor().getCode()); - } - - @Test - public void treatmenteCommentNullTest() { - EntryRelationship entryRelationship = nullFamilyHistoryModel.getTreatmentComment(); - assertNull(entryRelationship); - } - - @Test - public void billingCodeTest() { - EntryRelationship entryRelationship = familyHistoryModel.getBillingCode(); - assertNotNull(entryRelationship); - } - - @Test - public void billingCodeNullTest() { - EntryRelationship entryRelationship = nullFamilyHistoryModel.getBillingCode(); - assertNotNull(entryRelationship); - } - - @Test - public void lifestageObservationTest() { - EntryRelationship entryRelationship = familyHistoryModel.getLifestageOnset(); - assertNotNull(entryRelationship); - } - - @Test - public void lifestageObservationNullTest() { - EntryRelationship entryRelationship = nullFamilyHistoryModel.getLifestageOnset(); - assertNull(entryRelationship); - } - - @Test - public void ageAtOnsetTest() { - Integer age = Integer.parseInt(familyHistoryEntry.getExtMap().get(CaseManagementNoteExt.AGEATONSET)); - - EntryRelationship entryRelationship = familyHistoryModel.getAgeAtOnset(); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals("30972-4", code.getCode()); - assertEquals(Constants.CodeSystems.LOINC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.LOINC_NAME, code.getCodeSystemName()); - assertEquals("Age at onset", code.getDisplayName()); - - assertEquals(INT.class, observation.getValue().getDataType()); - INT value = (INT) observation.getValue(); - assertNotNull(value); - assertEquals(age, value.getValue()); - } - - @Test - public void ageAtOnsetNullTest() { - EntryRelationship entryRelationship = nullFamilyHistoryModel.getAgeAtOnset(); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/ImmunizationsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/ImmunizationsModelTest.java deleted file mode 100644 index 478479590f..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/ImmunizationsModelTest.java +++ /dev/null @@ -1,341 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.datatypes.interfaces.ISetComponent; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.common.dao.PreventionDao; -import org.oscarehr.common.dao.PreventionExtDao; -import org.oscarehr.common.model.Prevention; -import org.oscarehr.common.model.PreventionExt; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Immunization; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class ImmunizationsModelTest extends AbstractExportModelTest { - public static Prevention prevention; - public static List preventionExt; - public static Immunization immunization; - public static ImmunizationsModel immunizationsModel; - public static ImmunizationsModel nullImmunizationsModel; - - @BeforeClass - public static void beforeClass() { - PreventionDao preventionDao = SpringUtils.getBean(PreventionDao.class); - PreventionExtDao preventionExtDao = SpringUtils.getBean(PreventionExtDao.class); - - prevention = preventionDao.findNotDeletedByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - preventionExt = preventionExtDao.findByPreventionId(Constants.Runtime.VALID_PREVENTION); - } - - @Before - public void before() { - immunization = new Immunization(prevention, preventionExt); - immunizationsModel = new ImmunizationsModel(immunization); - nullImmunizationsModel = new ImmunizationsModel(new Immunization(null, null)); - } - - @Test - public void immunizationsModelNullTest() { - assertNotNull(new ImmunizationsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = immunizationsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullImmunizationsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void negationIndTest() { - BL negationInd = immunizationsModel.getNegationInd(); - assertNotNull(negationInd); - assertFalse(negationInd.toBoolean()); - } - - @Test - public void negationIndNullTest() { - BL negationInd = nullImmunizationsModel.getNegationInd(); - assertNotNull(negationInd); - assertFalse(negationInd.toBoolean()); - } - - @Test - public void idTest() { - SET ids = immunizationsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Immunizations.toString())); - assertTrue(id.getExtension().contains(prevention.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullImmunizationsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = immunizationsModel.getCode(); - assertNotNull(code); - - assertEquals(Constants.SubstanceAdministrationType.IMMUNIZ.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - } - - @Test - public void codeNullTest() { - CD code = nullImmunizationsModel.getCode(); - assertNotNull(code); - - assertEquals(Constants.SubstanceAdministrationType.IMMUNIZ.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - } - - @Test - public void effectiveTimeTest() { - ArrayList> effectiveTime = immunizationsModel.getEffectiveTime(); - assertNotNull(effectiveTime); - assertEquals(1, effectiveTime.size()); - - IVL ivl = (IVL) effectiveTime.get(0); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(immunization.getPrevention().getPreventionDate()), ivl.getLow()); - assertNull(ivl.getHigh()); - } - - @Test - public void effectiveTimeNullTest() { - ArrayList> effectiveTime = nullImmunizationsModel.getEffectiveTime(); - assertNotNull(effectiveTime); - assertEquals(1, effectiveTime.size()); - - IVL ivl = (IVL) effectiveTime.get(0); - assertNotNull(ivl); - assertTrue(ivl.getLow().isNull()); - assertEquals(NullFlavor.Unknown, ivl.getLow().getNullFlavor().getCode()); - assertNull(ivl.getHigh()); - } - - @Test - public void routeTest() { - CE route = immunizationsModel.getRoute(); - assertNotNull(route); - assertTrue(route.isNull()); - assertEquals(NullFlavor.Other, route.getNullFlavor().getCode()); - assertEquals(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_OID, route.getCodeSystem()); - assertEquals(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_NAME, route.getCodeSystemName()); - assertEquals(immunization.getPreventionMap().get(Constants.PreventionExtKeys.route.toString()), new String(route.getOriginalText().getData())); - } - - @Test - public void routeNullTest() { - CE route = nullImmunizationsModel.getRoute(); - assertNull(route); - } - - @Test - public void consumableTest() { - Consumable consumable = immunizationsModel.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void consumableNullTest() { - Consumable consumable = nullImmunizationsModel.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void authorTest() { - ArrayList authors = immunizationsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - ArrayList authors = nullImmunizationsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void participantTest() { - ArrayList participants = immunizationsModel.getParticipant(); - assertNotNull(participants); - assertEquals(1, participants.size()); - - Participant2 participant = participants.get(0); - assertNotNull(participant); - assertEquals(ParticipationType.LOC, participant.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, participant.getContextControlCode().getCode()); - - ParticipantRole participantRole = participant.getParticipantRole(); - assertNotNull(participantRole); - assertEquals(Constants.RoleClass.SDLOC.toString(), participantRole.getClassCode().getCode()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.Organization, playingEntity.getClassCode().getCode()); - assertNotNull(playingEntity.getName()); - assertNotNull(playingEntity.getName().get(0)); - - ENXP enxp = playingEntity.getName().get(0).getPart(0); - assertNotNull(enxp); - assertEquals(immunization.getPreventionMap().get(Constants.PreventionExtKeys.location.toString()), enxp.getValue()); - } - - @Test - public void participantNullTest() { - ArrayList participants = nullImmunizationsModel.getParticipant(); - assertNotNull(participants); - assertEquals(1, participants.size()); - - Participant2 participant = participants.get(0); - assertNotNull(participant); - assertEquals(ParticipationType.LOC, participant.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, participant.getContextControlCode().getCode()); - - ParticipantRole participantRole = participant.getParticipantRole(); - assertNotNull(participantRole); - assertEquals(Constants.RoleClass.SDLOC.toString(), participantRole.getClassCode().getCode()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.Organization, playingEntity.getClassCode().getCode()); - assertNull(playingEntity.getName()); - } - - @Test - public void antigenTypeTest() { - EntryRelationship entryRelationship = immunizationsModel.getAntigenType(); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - SubstanceAdministration substanceAdministration = entryRelationship.getClinicalStatementIfSubstanceAdministration(); - assertNotNull(substanceAdministration); - - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void antigenTypeNullTest() { - EntryRelationship entryRelationship = nullImmunizationsModel.getAntigenType(); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - SubstanceAdministration substanceAdministration = entryRelationship.getClinicalStatementIfSubstanceAdministration(); - assertNotNull(substanceAdministration); - - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void reasonTest() { - EntryRelationship entryRelationship = immunizationsModel.getRefusalReason(); - assertNotNull(entryRelationship); - } - - @Test - public void reasonNullTest() { - EntryRelationship entryRelationship = nullImmunizationsModel.getRefusalReason(); - assertNull(entryRelationship); - } - - @Test - public void nextDateTest() { - EntryRelationship entryRelationship = immunizationsModel.getNextDate(); - assertNotNull(entryRelationship); - } - - @Test - public void nextDateNullTest() { - EntryRelationship entryRelationship = nullImmunizationsModel.getNextDate(); - assertNull(entryRelationship); - } - - @Test - public void commentTest() { - EntryRelationship entryRelationship = immunizationsModel.getComment(); - assertNotNull(entryRelationship); - } - - @Test - public void commentNullTest() { - EntryRelationship entryRelationship = nullImmunizationsModel.getComment(); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/LabsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/LabsModelTest.java deleted file mode 100644 index 6e219de0e9..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/LabsModelTest.java +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.oscarehr.common.dao.Hl7TextInfoDao; -import org.oscarehr.common.model.Hl7TextInfo; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Lab; -import org.oscarehr.e2e.model.PatientExport.LabOrganizer; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class LabsModelTest extends AbstractExportModelTest { - public static Hl7TextInfoDao dao; - public static Hl7TextInfo hl7TextInfo; - public static LabsModel labsModel; - - public static Hl7TextInfo nullHl7TextInfo; - public static LabsModel nullLabsModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(Hl7TextInfoDao.class); - hl7TextInfo = dao.findLabId(Constants.Runtime.VALID_LAB_NO); - Lab lab = new Lab(hl7TextInfo); - lab.getLabOrganizer().add(new LabOrganizer(Constants.Runtime.INVALID_VALUE, null)); - lab.getLabOrganizer().add(new LabOrganizer(Constants.Runtime.INVALID_VALUE, null)); - labsModel = new LabsModel(lab); - - nullHl7TextInfo = new Hl7TextInfo(); - Lab nullLab = new Lab(nullHl7TextInfo); - nullLabsModel = new LabsModel(nullLab); - } - - @Test - public void labsModelNullTest() { - assertNotNull(new LabsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = labsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullLabsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = labsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Lab.toString())); - assertTrue(id.getExtension().contains(Constants.Runtime.VALID_LAB_NO.toString())); - } - - @Test - public void idNullTest() { - SET ids = nullLabsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = labsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void codeNullTest() { - CD code = nullLabsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void textTest() { - ED text = labsModel.getText(); - assertNotNull(text); - assertEquals(hl7TextInfo.getDiscipline(), new String(text.getData())); - } - - @Test - public void textNullTest() { - ED text = nullLabsModel.getText(); - assertNull(text); - } - - @Test - public void authorTest() { - ArrayList authors = labsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - ArrayList authors = nullLabsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void resultOrganizersTest() { - ArrayList resultOrganizers = labsModel.getResultOrganizers(); - assertNotNull(resultOrganizers); - assertEquals(2, resultOrganizers.size()); - } - - @Test - public void resultOrganizersNullTest() { - ArrayList resultOrganizers = nullLabsModel.getResultOrganizers(); - assertNotNull(resultOrganizers); - assertEquals(1, resultOrganizers.size()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/MedicationsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/MedicationsModelTest.java deleted file mode 100644 index b8edc83db4..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/MedicationsModelTest.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.Date; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.oscarehr.common.dao.DrugDao; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.BodyConstants; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class MedicationsModelTest extends AbstractExportModelTest { - public static DrugDao dao; - public static Drug drug; - public static MedicationsModel medicationsModel; - - public static Drug nullDrug; - public static MedicationsModel nullMedicationsModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(DrugDao.class); - drug = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - medicationsModel = new MedicationsModel(drug); - - nullDrug = new Drug(); - nullMedicationsModel = new MedicationsModel(nullDrug); - } - - @Test - public void medicationsModelNullTest() { - assertNotNull(new MedicationsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = medicationsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullMedicationsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = medicationsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.Medications.toString())); - assertTrue(id.getExtension().contains(drug.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullMedicationsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = medicationsModel.getCode(); - assertNotNull(code); - - assertEquals(Constants.SubstanceAdministrationType.DRUG.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - assertEquals(BodyConstants.Medications.DRUG_THERAPY_ACT_NAME, code.getDisplayName()); - } - - @Test - public void codeNullTest() { - CD code = nullMedicationsModel.getCode(); - assertNotNull(code); - - assertEquals(Constants.SubstanceAdministrationType.DRUG.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - assertEquals(BodyConstants.Medications.DRUG_THERAPY_ACT_NAME, code.getDisplayName()); - } - - @Test - public void statusCodeActiveTest() { - ActStatus status = medicationsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - - Drug drug2 = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - drug2.setLongTerm(false); - drug2.setEndDate(new Date()); - MedicationsModel medicationsModel2 = new MedicationsModel(drug2); - - ActStatus status2 = medicationsModel2.getStatusCode(); - assertNotNull(status2); - assertEquals(ActStatus.Active, status2); - } - - @Test - public void statusCodeCompleteTest() { - Drug drug2 = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - drug2.setLongTerm(false); - MedicationsModel medicationsModel2 = new MedicationsModel(drug2); - - ActStatus status = medicationsModel2.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - - Drug drug3 = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - drug3.setArchived(true); - MedicationsModel medicationsModel3 = new MedicationsModel(drug3); - - ActStatus status2 = medicationsModel3.getStatusCode(); - assertNotNull(status2); - assertEquals(ActStatus.Completed, status2); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullMedicationsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void consumableTest() { - Consumable consumable = medicationsModel.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void consumableNullTest() { - Consumable consumable = nullMedicationsModel.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void recordTypeTest() { - EntryRelationship entryRelationship = medicationsModel.getRecordType(); - assertNotNull(entryRelationship); - } - - @Test - public void recordTypeNullTest() { - EntryRelationship entryRelationship = nullMedicationsModel.getRecordType(); - assertNotNull(entryRelationship); - } - - @Test - public void lastReviewDateTest() { - EntryRelationship entryRelationship = medicationsModel.getLastReviewDate(); - assertNotNull(entryRelationship); - } - - @Test - public void lastReviewDateNullTest() { - EntryRelationship entryRelationship = nullMedicationsModel.getLastReviewDate(); - assertNull(entryRelationship); - } - - @Test - public void prescriptionInformationTest() { - EntryRelationship entryRelationship = medicationsModel.getPrescriptionInformation(); - assertNotNull(entryRelationship); - } - - @Test - public void prescriptionInformationNullTest() { - EntryRelationship entryRelationship = nullMedicationsModel.getPrescriptionInformation(); - assertNotNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/ProblemsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/ProblemsModelTest.java deleted file mode 100644 index c8489d6fc5..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/ProblemsModelTest.java +++ /dev/null @@ -1,215 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.oscarehr.common.dao.DxresearchDAO; -import org.oscarehr.common.model.Dxresearch; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class ProblemsModelTest extends AbstractExportModelTest { - public static DxresearchDAO dao; - public static Dxresearch problem; - public static ProblemsModel problemsModel; - - public static Dxresearch nullProblem; - public static ProblemsModel nullProblemsModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(DxresearchDAO.class); - problem = dao.getDxResearchItemsByPatient(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - problemsModel = new ProblemsModel(problem); - - nullProblem = new Dxresearch(); - nullProblemsModel = new ProblemsModel(nullProblem); - } - - @Test - public void problemsModelNullTest() { - assertNotNull(new ProblemsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = problemsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullProblemsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = problemsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.ProblemList.toString())); - assertTrue(id.getExtension().contains(problem.getDxresearchNo().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullProblemsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = problemsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void codeNullTest() { - CD code = nullProblemsModel.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void textTest() { - ED text = problemsModel.getText(); - assertNotNull(text); - } - - @Test - public void textNullTest() { - ED text = nullProblemsModel.getText(); - assertNull(text); - } - - @Test - public void statusCodeActiveTest() { - ActStatus status = problemsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - } - - @Test - public void statusCodeCompleteTest() { - Dxresearch problem2 = dao.getDxResearchItemsByPatient(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - problem2.setStatus('C'); - ProblemsModel problemsModel2 = new ProblemsModel(problem2); - - ActStatus status = problemsModel2.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullProblemsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void effectiveTimeTest() { - IVL ivl = problemsModel.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(problem.getStartDate()), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = nullProblemsModel.getEffectiveTime(); - assertNull(ivl); - } - - @Test - public void valueTest() { - CD value = problemsModel.getValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @Test - public void valueNullTest() { - CD value = nullProblemsModel.getValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @Test - public void authorTest() { - ArrayList authors = problemsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - ArrayList authors = nullProblemsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void lastReviewDateTest() { - EntryRelationship entryRelationship = problemsModel.getDiagnosisDate(); - assertNotNull(entryRelationship); - } - - @Test - public void lastReviewDateNullTest() { - EntryRelationship entryRelationship = nullProblemsModel.getDiagnosisDate(); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/body/RiskFactorsModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/body/RiskFactorsModelTest.java deleted file mode 100644 index 323a84ff58..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/body/RiskFactorsModelTest.java +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.casemgmt.dao.CaseManagementNoteDAO; -import org.oscarehr.casemgmt.model.CaseManagementNote; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class RiskFactorsModelTest extends AbstractExportModelTest { - public static CaseManagementNoteDAO dao; - public static CaseManagementNote riskFactor; - public static RiskFactorsModel riskFactorsModel; - - public static CaseManagementNote nullRiskFactor; - public static RiskFactorsModel nullRiskFactorsModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(CaseManagementNoteDAO.class); - riskFactor = dao.getNotesByDemographic(Constants.Runtime.VALID_DEMOGRAPHIC.toString()).get(1); - riskFactorsModel = new RiskFactorsModel(riskFactor); - - nullRiskFactor = new CaseManagementNote(); - nullRiskFactorsModel = new RiskFactorsModel(nullRiskFactor); - } - - @Test - public void riskFactorsModelNullTest() { - assertNotNull(new RiskFactorsModel(null)); - } - - @Test - public void textSummaryTest() { - String text = riskFactorsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void textSummaryNullTest() { - String text = nullRiskFactorsModel.getTextSummary(); - assertNotNull(text); - } - - @Test - public void idTest() { - SET ids = riskFactorsModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.RiskFactors.toString())); - assertTrue(id.getExtension().contains(riskFactor.getId().toString())); - } - - @Test - public void idNullTest() { - SET ids = nullRiskFactorsModel.getIds(); - assertNotNull(ids); - } - - @Test - public void codeTest() { - CD code = riskFactorsModel.getCode(); - assertNotNull(code); - assertEquals("40514009", code.getCode()); - assertEquals(Constants.CodeSystems.SNOMED_CT_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.SNOMED_CT_NAME, code.getCodeSystemName()); - } - - @Test - public void codeNullTest() { - CD code = nullRiskFactorsModel.getCode(); - assertNotNull(code); - assertEquals("40514009", code.getCode()); - assertEquals(Constants.CodeSystems.SNOMED_CT_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.SNOMED_CT_NAME, code.getCodeSystemName()); - } - - @Test - public void statusCodeTest() { - ActStatus status = riskFactorsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status); - } - - @Test - public void statusCodeNullTest() { - ActStatus status = nullRiskFactorsModel.getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status); - } - - @Test - public void authorTest() { - ArrayList authors = riskFactorsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - ArrayList authors = nullRiskFactorsModel.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void componentObservationTest() { - ArrayList components = riskFactorsModel.getComponentObservation(); - assertNotNull(components); - assertEquals(1, components.size()); - - Component4 component = components.get(0); - assertNotNull(component); - assertEquals(ActRelationshipHasComponent.HasComponent, component.getTypeCode().getCode()); - assertTrue(component.getContextConductionInd().toBoolean()); - - Observation observation = component.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getValue()); - } - - @Test - public void componentObservationNullTest() { - ArrayList components = nullRiskFactorsModel.getComponentObservation(); - assertNotNull(components); - assertEquals(1, components.size()); - - Component4 component = components.get(0); - assertNotNull(component); - assertEquals(ActRelationshipHasComponent.HasComponent, component.getTypeCode().getCode()); - assertTrue(component.getContextConductionInd().toBoolean()); - - Observation observation = component.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getValue()); - } - - @Test - public void observationCodeTest() { - CD code = riskFactorsModel.getObservationCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void observationCodeNullTest() { - CD code = nullRiskFactorsModel.getObservationCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void observationNameTest() { - ED text = riskFactorsModel.getObservationName(); - assertNotNull(text); - assertEquals(riskFactor.getNote(), new String(text.getData())); - } - - @Test - public void observationNameNullTest() { - ED text = nullRiskFactorsModel.getObservationName(); - assertNull(text); - } - - @Test - public void observationDateTest() { - IVL ivl = riskFactorsModel.getObservationDate(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(riskFactor.getObservation_date()), ivl.getLow()); - } - - @Test - public void observationDateNullTest() { - IVL ivl = nullRiskFactorsModel.getObservationDate(); - assertNull(ivl); - } - - @Test - public void observationValueTest() { - ST value = riskFactorsModel.getObservationValue(); - assertNotNull(value); - assertEquals(riskFactor.getNote(), value.getValue()); - } - - @Test - public void observationValueNullTest() { - ST value = nullRiskFactorsModel.getObservationValue(); - assertNotNull(value); - assertTrue(value.isNull()); - assertEquals(NullFlavor.NoInformation, value.getNullFlavor().getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/header/AuthorModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/header/AuthorModelTest.java deleted file mode 100644 index a6e240539f..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/header/AuthorModelTest.java +++ /dev/null @@ -1,239 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNamePartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AuthoringDevice; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Person; -import org.oscarehr.common.dao.ProviderDataDao; -import org.oscarehr.common.model.ProviderData; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class AuthorModelTest extends AbstractExportModelTest { - public static ProviderDataDao dao; - public static ProviderData provider; - public static AuthorModel authorModel; - - public static ProviderData nullProvider; - public static AuthorModel nullAuthorModel; - - public static final String test = "test"; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(ProviderDataDao.class); - } - - @Before - public void before() { - provider = dao.findByProviderNo(Constants.Runtime.VALID_PROVIDER.toString()); - authorModel = new AuthorModel(provider); - - nullProvider = new ProviderData(); - nullAuthorModel = new AuthorModel(nullProvider); - } - - @Test - public void nullProviderModelTest() { - ProviderData provider = null; - AuthorModel authorModel = new AuthorModel(provider); - assertNotNull(authorModel); - } - - @Test - public void idPractitionerNoTest() { - SET ids = authorModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.DocumentHeader.BC_MINISTRY_OF_HEALTH_PRACTITIONER_ID_OID, id.getRoot()); - assertEquals(Constants.DocumentHeader.BC_MINISTRY_OF_HEALTH_PRACTITIONER_NAME, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(provider.getPractitionerNo(), id.getExtension()); - } - - @Test - public void idOhipNoTest() { - nullProvider.setOhipNo(test); - AuthorModel model = new AuthorModel(nullProvider); - - SET ids = model.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.DocumentHeader.MEDICAL_SERVICES_PLAN_BILLING_NUMBER_OID, id.getRoot()); - assertEquals(Constants.DocumentHeader.MEDICAL_SERVICES_PLAN_BILLING_NUMBER_NAME, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(nullProvider.getOhipNo().toString(), id.getExtension()); - } - - @Test - public void idProviderNoTest() { - nullProvider.set("1"); - AuthorModel model = new AuthorModel(nullProvider); - - SET ids = model.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.DocumentHeader.LOCALLY_ASSIGNED_IDENTIFIER_OID, id.getRoot()); - assertEquals(Constants.DocumentHeader.LOCALLY_ASSIGNED_IDENTIFIER_NAME, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(nullProvider.getId(), id.getExtension()); - } - - @Test - public void idNullTest() { - SET ids = nullAuthorModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void telecomFullTest() { - SET telecoms = authorModel.getTelecoms(); - assertNotNull(telecoms); - assertEquals(3, telecoms.size()); - - TEL tel0 = telecoms.get(0); - assertNotNull(tel0); - assertTrue(TEL.isValidPhoneFlavor(tel0)); - assertEquals("tel:" + provider.getPhone().replaceAll("-", ""), tel0.getValue()); - - TEL tel1 = telecoms.get(1); - assertNotNull(tel1); - assertTrue(TEL.isValidPhoneFlavor(tel1)); - assertEquals("tel:" + provider.getWorkPhone().replaceAll("-", ""), tel1.getValue()); - - TEL tel2 = telecoms.get(2); - assertNotNull(tel2); - assertTrue(TEL.isValidEMailFlavor(tel2)); - assertEquals("mailto:" + provider.getEmail(), tel2.getValue()); - } - - @Test - public void telecomNullTest() { - SET telecoms = nullAuthorModel.getTelecoms(); - assertNull(telecoms); - } - - @Test - public void personFullTest() { - Person person = authorModel.getPerson(); - assertNotNull(person); - - SET names = person.getName(); - assertNotNull(names); - assertEquals(1, names.size()); - - PN name = names.get(0); - assertNotNull(name); - assertEquals(EntityNameUse.OfficialRecord, name.getUse().get(0).getCode()); - - List nameParts = name.getParts(); - assertNotNull(nameParts); - assertEquals(2, nameParts.size()); - assertTrue(nameParts.contains(new ENXP(provider.getFirstName(), EntityNamePartType.Given))); - assertTrue(nameParts.contains(new ENXP(provider.getLastName(), EntityNamePartType.Family))); - } - - @Test - public void personNullTest() { - Person person = nullAuthorModel.getPerson(); - assertNotNull(person); - - SET names = person.getName(); - assertNotNull(names); - assertEquals(1, names.size()); - - PN name = names.get(0); - assertNotNull(name); - assertTrue(name.isNull()); - assertEquals(NullFlavor.NoInformation, name.getNullFlavor().getCode()); - } - - @Test - public void deviceIdTest() { - SET ids = authorModel.getDeviceIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void deviceIdNullTest() { - SET ids = nullAuthorModel.getDeviceIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void deviceTest() { - AuthoringDevice device = authorModel.getDevice(); - assertNotNull(device); - assertEquals(Constants.EMR.EMR_VERSION, device.getSoftwareName().getValue()); - } - - @Test - public void deviceNullTest() { - AuthoringDevice device = nullAuthorModel.getDevice(); - assertNotNull(device); - assertEquals(Constants.EMR.EMR_VERSION, device.getSoftwareName().getValue()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/header/CustodianModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/header/CustodianModelTest.java deleted file mode 100644 index 268df05405..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/header/CustodianModelTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ON; -import org.marc.everest.datatypes.generic.SET; -import org.oscarehr.common.dao.ClinicDAO; -import org.oscarehr.common.model.Clinic; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class CustodianModelTest extends AbstractExportModelTest { - public static ClinicDAO dao; - public static Clinic clinic; - public static CustodianModel custodianModel; - - public static Clinic nullClinic; - public static CustodianModel nullCustodianModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(ClinicDAO.class); - clinic = dao.getClinic(); - custodianModel = new CustodianModel(clinic); - - nullClinic = new Clinic(); - nullCustodianModel = new CustodianModel(nullClinic); - } - - @Test - public void custodianModelNullTest() { - assertNotNull(new CustodianModel(null)); - } - - @Test - public void idTest() { - SET ids = custodianModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertEquals(Constants.EMR.EMR_VERSION, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(clinic.getId().toString(), id.getExtension()); - } - - @Test - public void idNullTest() { - SET ids = nullCustodianModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void nameTest() { - ON on = custodianModel.getName(); - assertNotNull(on); - - ENXP name = on.getPart(0); - assertNotNull(name); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(clinic.getClinicName())); - assertEquals(clinic.getClinicName(), name.getValue()); - } - - @Test - public void nameNullTest() { - ON on = nullCustodianModel.getName(); - assertNull(on); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/header/RecordTargetModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/header/RecordTargetModelTest.java deleted file mode 100644 index 5767ab8f6b..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/header/RecordTargetModelTest.java +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; -import org.marc.everest.datatypes.AD; -import org.marc.everest.datatypes.ADXP; -import org.marc.everest.datatypes.AddressPartType; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNamePartType; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.PostalAddressUse; -import org.marc.everest.datatypes.TEL; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.LanguageCommunication; -import org.marc.everest.rmim.uv.cdar2.vocabulary.AdministrativeGender; -import org.oscarehr.common.dao.DemographicDao; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class RecordTargetModelTest extends AbstractExportModelTest { - public static DemographicDao dao; - public static Demographic demographic; - public static RecordTargetModel recordTargetModel; - - public static Demographic nullDemographic; - public static RecordTargetModel nullRecordTargetModel; - - @Before - public void before() { - dao = SpringUtils.getBean(DemographicDao.class); - demographic = dao.getDemographicById(Constants.Runtime.VALID_DEMOGRAPHIC); - recordTargetModel = new RecordTargetModel(demographic); - - nullDemographic = new Demographic(); - nullRecordTargetModel = new RecordTargetModel(nullDemographic); - } - - @Test - public void recordTargetModelNullTest() { - assertNotNull(new RecordTargetModel(null)); - } - - @Test - public void idTest() { - SET ids = recordTargetModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.DocumentHeader.BC_PHN_OID, id.getRoot()); - assertEquals(Constants.DocumentHeader.BC_PHN_OID_ASSIGNING_AUTHORITY_NAME, id.getAssigningAuthorityName()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(demographic.getHin(), id.getExtension()); - } - - @Test - public void idNullTest() { - SET ids = nullRecordTargetModel.getIds(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void addressFullTest() { - SET addrSet = recordTargetModel.getAddresses(); - assertNotNull(addrSet); - assertEquals(1, addrSet.size()); - - AD addr = addrSet.get(0); - assertNotNull(addr); - assertEquals(1, addr.getUse().size()); - assertEquals(PostalAddressUse.HomeAddress, addr.getUse().get(0).getCode()); - - assertEquals(4, addr.getPart().size()); - assertTrue(addr.getPart().contains(new ADXP(demographic.getAddress(), AddressPartType.Delimiter))); - assertTrue(addr.getPart().contains(new ADXP(demographic.getCity(), AddressPartType.City))); - assertTrue(addr.getPart().contains(new ADXP(demographic.getProvince(), AddressPartType.State))); - assertTrue(addr.getPart().contains(new ADXP(demographic.getPostal(), AddressPartType.PostalCode))); - } - - @Test - public void addressNullTest() { - SET addrSet = nullRecordTargetModel.getAddresses(); - assertNull(addrSet); - } - - @Test - public void telecomFullTest() { - SET telecoms = recordTargetModel.getTelecoms(); - assertNotNull(telecoms); - assertEquals(3, telecoms.size()); - - TEL tel0 = telecoms.get(0); - assertNotNull(tel0); - assertTrue(TEL.isValidPhoneFlavor(tel0)); - assertEquals("tel:" + demographic.getPhone().replaceAll("-", ""), tel0.getValue()); - - TEL tel1 = telecoms.get(1); - assertNotNull(tel1); - assertTrue(TEL.isValidPhoneFlavor(tel1)); - assertEquals("tel:" + demographic.getPhone2().replaceAll("-", ""), tel1.getValue()); - - TEL tel2 = telecoms.get(2); - assertNotNull(tel2); - assertTrue(TEL.isValidEMailFlavor(tel2)); - assertEquals("mailto:" + demographic.getEmail(), tel2.getValue()); - } - - @Test - public void telecomNullTest() { - SET telecoms = nullRecordTargetModel.getTelecoms(); - assertNull(telecoms); - } - - @Test - public void nameFullTest() { - SET names = recordTargetModel.getNames(); - assertNotNull(names); - assertEquals(1, names.size()); - - PN name = names.get(0); - assertNotNull(name); - assertEquals(EntityNameUse.Legal, name.getUse().get(0).getCode()); - - List nameParts = name.getParts(); - assertNotNull(nameParts); - assertEquals(2, nameParts.size()); - assertTrue(nameParts.contains(new ENXP(demographic.getFirstName(), EntityNamePartType.Given))); - assertTrue(nameParts.contains(new ENXP(demographic.getLastName(), EntityNamePartType.Family))); - } - - @Test - public void nameNullTest() { - SET names = nullRecordTargetModel.getNames(); - assertNull(names); - } - - @Test - public void genderTest() { - CE gender = recordTargetModel.getGender(); - assertNotNull(gender); - String sexCode = demographic.getSex().toUpperCase().replace("U", "UN"); - assertEquals(Mappings.genderCode.get(sexCode), gender.getCode()); - assertEquals(Mappings.genderDescription.get(sexCode), gender.getDisplayName()); - } - - @Test - public void invalidGenderTest() { - Demographic invalidGender = new Demographic(); - invalidGender.setSex("z"); - RecordTargetModel invalidGenderModel = new RecordTargetModel(invalidGender); - - CE gender = invalidGenderModel.getGender(); - assertNotNull(gender); - assertTrue(gender.isNull()); - assertEquals(NullFlavor.NoInformation, gender.getNullFlavor().getCode()); - } - - @Test - public void genderNullTest() { - CE gender = nullRecordTargetModel.getGender(); - assertNotNull(gender); - assertTrue(gender.isNull()); - assertEquals(NullFlavor.NoInformation, gender.getNullFlavor().getCode()); - } - - @Test - public void birthDateValidTest() { - TS birthDate = recordTargetModel.getBirthDate(); - assertNotNull(birthDate); - - Calendar cal = birthDate.getDateValue(); - assertNotNull(cal); - assertEquals(Integer.parseInt(demographic.getYearOfBirth()), cal.get(Calendar.YEAR)); - // Month starts counting from 0, not 1 - assertEquals(Integer.parseInt(demographic.getMonthOfBirth())-1, cal.get(Calendar.MONTH)); - assertEquals(Integer.parseInt(demographic.getDateOfBirth()), cal.get(Calendar.DATE)); - } - - @Test - public void birthDatePartialTest() { - Demographic demographic2 = dao.getDemographicById(Constants.Runtime.VALID_DEMOGRAPHIC); - demographic2.setDateOfBirth("40"); - RecordTargetModel recordTargetModel2 = new RecordTargetModel(demographic2); - - TS birthDate = recordTargetModel2.getBirthDate(); - assertNotNull(birthDate); - - Calendar cal = birthDate.getDateValue(); - assertNotNull(cal); - assertEquals(Integer.parseInt(demographic2.getYearOfBirth()), cal.get(Calendar.YEAR)); - // Month starts counting from 0, not 1 - assertEquals(Integer.parseInt(demographic2.getMonthOfBirth())-1, cal.get(Calendar.MONTH)); - } - - @Test - public void birthDateInvalidTest() { - Demographic demographic2 = dao.getDemographicById(Constants.Runtime.VALID_DEMOGRAPHIC); - demographic2.setMonthOfBirth("40"); - RecordTargetModel recordTargetModel2 = new RecordTargetModel(demographic2); - - TS birthDate = recordTargetModel2.getBirthDate(); - assertNotNull(birthDate); - assertTrue(birthDate.isNull()); - assertEquals(NullFlavor.Other, birthDate.getNullFlavor().getCode()); - } - - @Test - public void birthDateNullTest() { - TS birthDate = nullRecordTargetModel.getBirthDate(); - assertNotNull(birthDate); - assertTrue(birthDate.isNull()); - assertEquals(NullFlavor.NoInformation, birthDate.getNullFlavor().getCode()); - } - - @Test - public void languageCommunicationTest() { - ArrayList languages = recordTargetModel.getLanguages(); - assertNotNull(languages); - - LanguageCommunication language = languages.get(0); - assertNotNull(language); - assertEquals(Mappings.languageCode.get(demographic.getOfficialLanguage()), language.getLanguageCode().getCode()); - } - - @Test - public void languageCommunicationNullTest() { - ArrayList languages = nullRecordTargetModel.getLanguages(); - assertNull(languages); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModelTest.java deleted file mode 100644 index 15aae79a1c..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/AuthorParticipationModelTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedAuthor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; - -public class AuthorParticipationModelTest extends AbstractExportModelTest { - private static Date date; - - @BeforeClass - public static void beforeClass() { - date = new Date(); - } - - @Test - public void authorParticipationStructureTest() { - String test = "test"; - Author author = new AuthorParticipationModel().getAuthor(date, test); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertTrue(author.getTemplateId().contains(new II(Constants.TemplateOids.AUTHOR_PARTICIPATION_TEMPLATE_ID))); - - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); - TS now = new TS(calendar, TS.DAY); - assertFalse(author.getTime().isInvalidDate()); - assertTrue(author.getTime().toString().contains(now.toString())); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedPerson()); - } - - @Test - public void authorParticipationNullTest() { - Author author = new AuthorParticipationModel().getAuthor(null, null); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertTrue(author.getTemplateId().contains(new II(Constants.TemplateOids.AUTHOR_PARTICIPATION_TEMPLATE_ID))); - assertTrue(author.getTime().isNull()); - assertEquals(NullFlavor.Unknown, author.getTime().getNullFlavor().getCode()); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedPerson()); - } - - @Test - public void authorParticipationProviderStructureTest() { - Author author = new AuthorParticipationModel(Constants.Runtime.VALID_PROVIDER.toString()).getAuthor(date); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertTrue(author.getTemplateId().contains(new II(Constants.TemplateOids.AUTHOR_PARTICIPATION_TEMPLATE_ID))); - - Calendar calendar = new GregorianCalendar(); - calendar.setTime(date); - TS now = new TS(calendar, TS.DAY); - assertFalse(author.getTime().isInvalidDate()); - assertTrue(author.getTime().toString().contains(now.toString())); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedPerson()); - } - - @Test - public void authorParticipationProviderNullTest() { - Author author = new AuthorParticipationModel(null).getAuthor(null); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertTrue(author.getTemplateId().contains(new II(Constants.TemplateOids.AUTHOR_PARTICIPATION_TEMPLATE_ID))); - assertTrue(author.getTime().isNull()); - assertEquals(NullFlavor.Unknown, author.getTime().getNullFlavor().getCode()); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedPerson()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/ConsumableModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/ConsumableModelTest.java deleted file mode 100644 index af04e41dcf..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/ConsumableModelTest.java +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.EN; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.LabeledDrug; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ManufacturedProduct; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Material; -import org.marc.everest.rmim.uv.cdar2.vocabulary.DrugEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityDeterminerDetermined; -import org.marc.everest.rmim.uv.cdar2.vocabulary.RoleClassManufacturedProduct; -import org.oscarehr.common.dao.DrugDao; -import org.oscarehr.common.dao.PreventionDao; -import org.oscarehr.common.dao.PreventionExtDao; -import org.oscarehr.common.model.Drug; -import org.oscarehr.common.model.Prevention; -import org.oscarehr.common.model.PreventionExt; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.Immunization; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class ConsumableModelTest extends AbstractExportModelTest { - public static PreventionDao preventionDao; - public static PreventionExtDao preventionExtDao; - public static Immunization immunization; - - public static DrugDao drugDao; - public static Drug drug; - public static ConsumableModel consumableModel; - - @BeforeClass - public static void beforeClass() { - preventionDao = SpringUtils.getBean(PreventionDao.class); - preventionExtDao = SpringUtils.getBean(PreventionExtDao.class); - drugDao = SpringUtils.getBean(DrugDao.class); - consumableModel = new ConsumableModel(); - - Prevention prevention = preventionDao.findNotDeletedByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - List preventionExt = preventionExtDao.findByPreventionId(Constants.Runtime.VALID_PREVENTION); - immunization = new Immunization(prevention, preventionExt); - } - - @Before - public void before() { - drug = drugDao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - } - - @Test - public void consumableImmunizationStructureTest() { - Consumable consumable = consumableModel.getConsumable(immunization); - assertNotNull(consumable); - - ManufacturedProduct manufacturedProduct = consumable.getManufacturedProduct(); - assertNotNull(manufacturedProduct); - assertEquals(RoleClassManufacturedProduct.ManufacturedProduct, manufacturedProduct.getClassCode().getCode()); - - Material material = manufacturedProduct.getManufacturedDrugOrOtherMaterialIfManufacturedMaterial(); - assertNotNull(material); - assertEquals(EntityDeterminerDetermined.Described, material.getDeterminerCode().getCode()); - assertNotNull(material.getCode()); - assertNotNull(material.getName()); - } - - @Test - public void consumableImmunizationNullTest() { - Immunization immunization = null; - Consumable consumable = consumableModel.getConsumable(immunization); - assertNotNull(consumable); - } - - @Test - public void consumableImmunizationCodeTest() { - Material material = materialHelper(immunization); - - CE code = material.getCode(); - assertNotNull(code); - assertEquals(EverestUtils.getPreventionType(immunization.getPrevention().getPreventionType()), code.getCode()); - assertEquals(Constants.CodeSystems.ATC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ATC_NAME, code.getCodeSystemName()); - } - - @Test - public void consumableImmunizationCodeNullTest() { - Material material = materialHelper(null); - - CE code = material.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void consumableImmunizationNameTest() { - Material material = materialHelper(immunization); - - EN name = material.getName(); - assertNotNull(name); - assertNotNull(name.getParts()); - assertEquals(1, name.getParts().size()); - assertEquals(immunization.getPrevention().getPreventionType(), name.getPart(0).getValue()); - } - - @Test - public void consumableImmunizationNameNullTest() { - Material material = materialHelper(null); - - EN name = material.getName(); - assertNotNull(name); - assertTrue(name.isNull()); - assertEquals(NullFlavor.NoInformation, name.getNullFlavor().getCode()); - } - - @Test - public void consumableImmunizationLotNumberTest() { - Material material = materialHelper(immunization); - - ST lot = material.getLotNumberText(); - assertNotNull(lot); - assertEquals(immunization.getPreventionMap().get(Constants.PreventionExtKeys.lot.toString()), lot.getValue()); - } - - @Test - public void consumableImmunizationLotNumberNullTest() { - Material material = materialHelper(null); - - ST lot = material.getLotNumberText(); - assertNull(lot); - } - - public Material materialHelper(Immunization immunization) { - Consumable consumable = consumableModel.getConsumable(immunization); - return consumable.getManufacturedProduct().getManufacturedDrugOrOtherMaterialIfManufacturedMaterial(); - } - - @Test - public void consumableDrugStructureTest() { - Consumable consumable = consumableModel.getConsumable(drug); - assertNotNull(consumable); - assertNotNull(consumable.getTemplateId()); - assertEquals(1, consumable.getTemplateId().size()); - assertEquals(Constants.TemplateOids.MEDICATION_IDENTIFICATION_TEMPLATE_ID, consumable.getTemplateId().get(0).getRoot()); - - ManufacturedProduct manufacturedProduct = consumable.getManufacturedProduct(); - assertNotNull(manufacturedProduct); - assertEquals(RoleClassManufacturedProduct.ManufacturedProduct, manufacturedProduct.getClassCode().getCode()); - - LabeledDrug labeledDrug = manufacturedProduct.getManufacturedDrugOrOtherMaterialIfManufacturedLabeledDrug(); - assertNotNull(labeledDrug); - assertEquals(EntityDeterminerDetermined.Described, labeledDrug.getDeterminerCode().getCode()); - assertNotNull(labeledDrug.getCode()); - assertNotNull(labeledDrug.getName()); - } - - @Test - public void consumableDrugNullTest() { - Drug drug = null; - Consumable consumable = consumableModel.getConsumable(drug); - assertNotNull(consumable); - } - - @Test - public void consumableDrugDINCodeTest() { - LabeledDrug labeledDrug = labeledDrugHelper(drug); - - CE code = labeledDrug.getCode(); - assertNotNull(code); - assertEquals(drug.getRegionalIdentifier().trim(), code.getCode().getCode()); - assertEquals(Constants.CodeSystems.DIN_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.DIN_NAME, code.getCodeSystemName()); - } - - @Test - public void consumableDrugATCCodeTest() { - drug.setRegionalIdentifier(null); - LabeledDrug labeledDrug = labeledDrugHelper(drug); - - CE code = labeledDrug.getCode(); - assertNotNull(code); - assertEquals(drug.getAtc().trim(), code.getCode().getCode()); - assertEquals(Constants.CodeSystems.ATC_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ATC_NAME, code.getCodeSystemName()); - } - - @Test - public void consumableDrugCodeNullTest() { - LabeledDrug labeledDrug = labeledDrugHelper(null); - - CE code = labeledDrug.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void consumableDrugGenericNameTest() { - LabeledDrug labeledDrug = labeledDrugHelper(drug); - - EN name = labeledDrug.getName(); - assertNotNull(name); - assertNotNull(name.getParts()); - assertEquals(1, name.getParts().size()); - assertEquals(drug.getGenericName(), name.getPart(0).getValue()); - } - - @Test - public void consumableDrugBrandNameTest() { - drug.setGenericName(null); - LabeledDrug labeledDrug = labeledDrugHelper(drug); - - EN name = labeledDrug.getName(); - assertNotNull(name); - assertNotNull(name.getParts()); - assertEquals(1, name.getParts().size()); - assertEquals(drug.getBrandName(), name.getPart(0).getValue()); - } - - @Test - public void consumableDrugNameNullTest() { - LabeledDrug labeledDrug = labeledDrugHelper(null); - - EN name = labeledDrug.getName(); - assertNotNull(name); - assertTrue(name.isNull()); - assertEquals(NullFlavor.NoInformation, name.getNullFlavor().getCode()); - } - - public LabeledDrug labeledDrugHelper(Drug drug) { - Consumable consumable = consumableModel.getConsumable(drug); - return consumable.getManufacturedProduct().getManufacturedDrugOrOtherMaterialIfManufacturedLabeledDrug(); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModelTest.java deleted file mode 100644 index a343dde5e2..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/MedicationPrescriptionEventModelTest.java +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.SetOperator; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.interfaces.ISetComponent; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.common.dao.DrugDao; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class MedicationPrescriptionEventModelTest extends AbstractExportModelTest { - public static DrugDao dao; - public static Drug drug; - public static Drug nullDrug; - public static MedicationPrescriptionEventModel mpeModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(DrugDao.class); - mpeModel = new MedicationPrescriptionEventModel(); - } - - @Before - public void before() { - drug = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - nullDrug = new Drug(); - } - - @Test - public void medicationPrescriptionEventStructureTest() { - EntryRelationship entryRelationship = mpeModel.getEntryRelationship(drug); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.TemplateOids.MEDICATION_PRESCRIPTION_EVENT_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - SubstanceAdministration substanceAdministration = entryRelationship.getClinicalStatementIfSubstanceAdministration(); - assertNotNull(substanceAdministration); - assertEquals(x_DocumentSubstanceMood.RQO, substanceAdministration.getMoodCode().getCode()); - - II id = substanceAdministration.getId().get(0); - assertNotNull(id); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.MedicationPrescriptions.toString())); - assertTrue(id.getExtension().contains(drug.getId().toString())); - - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - - CD code = substanceAdministration.getCode(); - assertNotNull(code); - assertEquals(Constants.SubstanceAdministrationType.DRUG.toString(), code.getCode()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME, code.getCodeSystemName()); - } - - @Test - public void medicationPrescriptionEventNullTest() { - EntryRelationship entryRelationship = mpeModel.getEntryRelationship(null); - assertNotNull(entryRelationship); - } - - @Test - public void effectiveTimeTest() { - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(drug); - ArrayList> effectiveTime = substanceAdministration.getEffectiveTime(); - assertNotNull(effectiveTime); - assertEquals(1, effectiveTime.size()); - - IVL ivl = (IVL) effectiveTime.get(0); - assertNotNull(ivl); - assertEquals(SetOperator.Inclusive, ivl.getOperator()); - assertEquals(EverestUtils.buildTSFromDate(drug.getRxDate()), ivl.getLow()); - assertEquals(EverestUtils.buildTSFromDate(drug.getEndDate()), ivl.getHigh()); - } - - @Test - public void effectiveTimeNullTest() { - nullDrug.setRxDate(null); - - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(nullDrug); - ArrayList> effectiveTime = substanceAdministration.getEffectiveTime(); - assertNotNull(effectiveTime); - assertEquals(1, effectiveTime.size()); - - IVL ivl = (IVL) effectiveTime.get(0); - assertNotNull(ivl); - assertEquals(SetOperator.Inclusive, ivl.getOperator()); - assertTrue(ivl.getLow().isNull()); - assertEquals(NullFlavor.Unknown, ivl.getLow().getNullFlavor().getCode()); - assertNull(ivl.getHigh()); - } - - @Test - public void consumableTest() { - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(drug); - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void consumableNullTest() { - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(nullDrug); - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void authorTest() { - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(drug); - ArrayList authors = substanceAdministration.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void authorNullTest() { - SubstanceAdministration substanceAdministration = substanceAdministrationHelper(nullDrug); - ArrayList authors = substanceAdministration.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - } - - @Test - public void doseStructureTest() { - ArrayList entryRelationships = substanceAdministrationHelper(drug).getEntryRelationship(); - assertNotNull(entryRelationships); - - EntryRelationship entryRelationship = entryRelationships.get(0); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.TemplateOids.DOSE_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - } - - @Test - public void doseNullTest() { - ArrayList entryRelationships = substanceAdministrationHelper(nullDrug).getEntryRelationship(); - assertNotNull(entryRelationships); - - EntryRelationship entryRelationship = entryRelationships.get(0); - assertNotNull(entryRelationship); - } - - public SubstanceAdministration substanceAdministrationHelper(Drug drug) { - EntryRelationship entryRelationship = mpeModel.getEntryRelationship(drug); - return entryRelationship.getClinicalStatementIfSubstanceAdministration(); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModelTest.java deleted file mode 100644 index ce9323e744..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/ProviderParticipationModelTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PN; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; - -public class ProviderParticipationModelTest extends AbstractExportModelTest { - @Test - public void providerParticipationStructureTest() { - Participant2 provider = new ProviderParticipationModel(Constants.Runtime.VALID_PROVIDER.toString()).getProvider(); - assertNotNull(provider); - assertEquals(ParticipationType.PrimaryPerformer, provider.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, provider.getContextControlCode().getCode()); - assertTrue(provider.getTemplateId().contains(new II(Constants.TemplateOids.PROVIDER_PARTICIPATION_TEMPLATE_ID))); - - ParticipantRole participantRole = provider.getParticipantRole(); - assertNotNull(participantRole); - assertNotNull(participantRole.getId()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertNotNull(playingEntity.getDesc()); - - SET names = playingEntity.getName(); - assertNotNull(names); - assertFalse(names.isNull()); - assertFalse(names.isEmpty()); - assertNotNull(names.get(0)); - } - - @Test - public void providerParticipationNullTest() { - Participant2 provider = new ProviderParticipationModel(null).getProvider(); - assertNotNull(provider); - assertEquals(ParticipationType.PrimaryPerformer, provider.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, provider.getContextControlCode().getCode()); - assertTrue(provider.getTemplateId().contains(new II(Constants.TemplateOids.PROVIDER_PARTICIPATION_TEMPLATE_ID))); - - ParticipantRole participantRole = provider.getParticipantRole(); - assertNotNull(participantRole); - assertNotNull(participantRole.getId()); - - PlayingEntity playingEntity = participantRole.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertNotNull(playingEntity.getDesc()); - - SET names = playingEntity.getName(); - assertNotNull(names); - assertFalse(names.isNull()); - assertFalse(names.isEmpty()); - assertNotNull(names.get(0)); - assertTrue(names.get(0).isNull()); - assertEquals(NullFlavor.NoInformation, names.get(0).getNullFlavor().getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/ResultComponentModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/ResultComponentModelTest.java deleted file mode 100644 index ddf3c14b27..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/ResultComponentModelTest.java +++ /dev/null @@ -1,529 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.ENXP; -import org.marc.everest.datatypes.EntityNameUse; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.ON; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedEntity; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ObservationRange; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organization; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Performer2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Procedure; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ReferenceRange; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ObservationInterpretation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationPhysicalPerformer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.common.dao.MeasurementDao; -import org.oscarehr.common.dao.MeasurementsExtDao; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.common.model.MeasurementsExt; -import org.oscarehr.e2e.constant.BodyConstants.Labs; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.LabComponent; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.e2e.util.EverestUtils; -import org.oscarehr.util.SpringUtils; - -public class ResultComponentModelTest extends AbstractExportModelTest { - public static MeasurementDao measurementDao; - public static MeasurementsExtDao measurementsExtDao; - - public static Measurement measurement; - public static List measurementsExt; - - public static LabComponent labComponent; - public static LabComponent nullLabComponent; - public static ResultComponentModel resultComponentModel; - - @BeforeClass - public static void beforeClass() { - measurementDao = SpringUtils.getBean(MeasurementDao.class); - measurementsExtDao = SpringUtils.getBean(MeasurementsExtDao.class); - - measurement = measurementDao.find(Constants.Runtime.VALID_LAB_MEASUREMENT); - measurementsExt = measurementsExtDao.getMeasurementsExtByMeasurementId(Constants.Runtime.VALID_LAB_MEASUREMENT); - resultComponentModel = new ResultComponentModel(); - } - - @Before - public void before() { - labComponent = new LabComponent(measurement, measurementsExt); - nullLabComponent = new LabComponent(null, null); - } - - @Test - public void resultComponentModelNullTest() { - assertNotNull(new ResultComponentModel()); - } - - @Test - public void resultComponentStructureTest() { - resultComponentStructureTestHelper(labComponent); - } - - @Test - public void resultComponentStructureNullTest() { - resultComponentStructureTestHelper(nullLabComponent); - } - - public void resultComponentStructureTestHelper(LabComponent labComponent) { - Component4 component = resultComponentModel.getComponent(labComponent); - assertNotNull(component); - assertEquals(ActRelationshipHasComponent.HasComponent, component.getTypeCode().getCode()); - assertTrue(component.getContextConductionInd().toBoolean()); - assertEquals(Constants.TemplateOids.RESULT_COMPONENT_TEMPLATE_ID, component.getTemplateId().get(0).getRoot()); - - Observation observation = component.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getStatusCode()); - } - - public Observation observationHelper(LabComponent labComponent) { - Component4 component = resultComponentModel.getComponent(labComponent); - return component.getClinicalStatementIfObservation(); - } - - @Test - public void idTest() { - SET ids = observationHelper(labComponent).getId(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertEquals(Constants.EMR.EMR_OID, id.getRoot()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getExtension())); - assertEquals(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.accession.toString()), id.getExtension()); - } - - @Test - public void idNullTest() { - SET ids = observationHelper(nullLabComponent).getId(); - assertNotNull(ids); - - II id = ids.get(0); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - } - - @Test - public void codeTest() { - CD code = observationHelper(labComponent).getCode(); - assertNotNull(code); - assertEquals(labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.identifier.toString()), code.getCode()); - assertEquals(Constants.CodeSystems.PCLOCD_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.PCLOCD_NAME, code.getCodeSystemName()); - } - - @Test - public void codeNullTest() { - CD code = observationHelper(nullLabComponent).getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.NoInformation, code.getNullFlavor().getCode()); - } - - @Test - public void textTest() { - String name = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.name.toString()); - ED text = observationHelper(labComponent).getText(); - assertNotNull(text); - assertEquals(name, new String(text.getData())); - } - - @Test - public void textNullTest() { - ED text = observationHelper(nullLabComponent).getText(); - assertNull(text); - } - - @Test - public void statusCodeActiveTest() { - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.olis_status.toString()); - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.olis_status.toString(), "P"); - - CS status = observationHelper(labComponent).getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Active, status.getCode()); - } - - @Test - public void statusCodeCompleteTest() { - CS status = observationHelper(labComponent).getStatusCode(); - assertNotNull(status); - assertEquals(ActStatus.Completed, status.getCode()); - } - - @Test - public void statusCodeNullTest() { - CS status = observationHelper(nullLabComponent).getStatusCode(); - assertNotNull(status); - assertTrue(status.isNull()); - assertEquals(NullFlavor.NoInformation, status.getNullFlavor().getCode()); - } - - @Test - public void effectiveTimeTest() { - String datetime = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.datetime.toString()); - IVL ivl = observationHelper(labComponent).getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(EverestUtils.stringToDate(datetime), TS.SECONDNOTIMEZONE), ivl.getLow()); - } - - @Test - public void effectiveTimeNullTest() { - IVL ivl = observationHelper(nullLabComponent).getEffectiveTime(); - assertNull(ivl); - } - - @Test - @Ignore - public void valuePQTest() { - String dataField = labComponent.getMeasurement().getDataField(); - String unit = "un it"; - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.unit.toString()); - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.unit.toString(), unit); - - ANY value = observationHelper(labComponent).getValue(); - assertNotNull(value); - assertEquals(PQ.class, value.getDataType()); - - PQ pq = (PQ) value; - assertEquals(new BigDecimal(dataField), pq.getValue()); - assertEquals(unit.replaceAll("\\s","_"), pq.getUnit()); - } - - @Test - public void valueSTValueUnitTest() { - String dataField = "test"; - String unit = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.unit.toString()); - labComponent.getMeasurement().setDataField(dataField); - - ANY value = observationHelper(labComponent).getValue(); - assertNotNull(value); - assertEquals(ST.class, value.getDataType()); - - ST st = (ST) value; - assertEquals(dataField.concat(" ").concat(unit), st.getValue()); - } - - @Test - public void valueSTValueOnlyTest() { - String dataField = labComponent.getMeasurement().getDataField(); - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.unit.toString()); - - ANY value = observationHelper(labComponent).getValue(); - assertNotNull(value); - assertEquals(ST.class, value.getDataType()); - - ST st = (ST) value; - assertEquals(dataField, st.getValue()); - } - - @Test - public void valueNullTest() { - ANY value = observationHelper(nullLabComponent).getValue(); - assertNull(value); - } - - @Test - public void interpretationCodeAbnormalTest() { - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.abnormal.toString()); - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.abnormal.toString(), Labs.ABNORMAL_CODE); - - SET> interpretationCodes = observationHelper(labComponent).getInterpretationCode(); - assertNotNull(interpretationCodes); - - CE interpretation = interpretationCodes.get(0); - assertNotNull(interpretation); - assertEquals(ObservationInterpretation.Abnormal, interpretation.getCode()); - assertEquals(Labs.ABNORMAL, interpretation.getDisplayName()); - } - - @Test - public void interpretationCodeNormalTest() { - SET> interpretationCodes = observationHelper(labComponent).getInterpretationCode(); - assertNotNull(interpretationCodes); - - CE interpretation = interpretationCodes.get(0); - assertNotNull(interpretation); - assertEquals(ObservationInterpretation.Normal, interpretation.getCode()); - assertEquals(Labs.NORMAL, interpretation.getDisplayName()); - } - - @Test - public void interpretationCodeNullTest() { - SET> interpretationCodes = observationHelper(nullLabComponent).getInterpretationCode(); - assertNull(interpretationCodes); - } - - @Test - public void performerTest() { - String labname = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.labname.toString()); - String datetime = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.datetime.toString()); - - ArrayList performers = observationHelper(labComponent).getPerformer(); - assertNotNull(performers); - assertEquals(1, performers.size()); - - Performer2 performer = performers.get(0); - assertNotNull(performer); - assertEquals(ParticipationPhysicalPerformer.PRF, performer.getTypeCode().getCode()); - assertEquals(Constants.TemplateOids.PERFORMER_PARTICIPATION_TEMPLATE_ID, performer.getTemplateId().get(0).getRoot()); - assertNotNull(performer.getTime()); - assertEquals(EverestUtils.buildTSFromDate(EverestUtils.stringToDate(datetime), TS.SECONDNOTIMEZONE), performer.getTime().getLow()); - - AssignedEntity assignedEntity = performer.getAssignedEntity(); - assertNotNull(assignedEntity); - assertNotNull(assignedEntity.getId()); - assertEquals(1, assignedEntity.getId().size()); - - II ii = assignedEntity.getId().get(0); - assertNotNull(ii); - assertTrue(ii.isNull()); - assertEquals(NullFlavor.NoInformation, ii.getNullFlavor().getCode()); - - Organization organization = assignedEntity.getRepresentedOrganization(); - assertNotNull(organization); - assertNotNull(organization.getName()); - - ON on = organization.getName().get(0); - assertNotNull(on); - assertEquals(EntityNameUse.OfficialRecord, on.getUse().get(0).getCode()); - assertNotNull(on.getParts()); - assertEquals(1, on.getParts().size()); - assertEquals(new ENXP(labname), on.getPart(0)); - } - - @Test - public void performerNullTest() { - ArrayList performers = observationHelper(nullLabComponent).getPerformer(); - assertNull(performers); - } - - @Test - public void specimenCollectionValidTest() { - String datetime = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.datetime.toString()); - - EntryRelationship entryRelationship = observationHelper(labComponent).getEntryRelationship().get(0); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - - Procedure procedure = entryRelationship.getClinicalStatementIfProcedure(); - assertNotNull(procedure); - assertNotNull(procedure.getEffectiveTime()); - assertEquals(EverestUtils.buildTSFromDate(EverestUtils.stringToDate(datetime), TS.SECONDNOTIMEZONE), procedure.getEffectiveTime().getLow()); - } - - @Test - public void specimenCollectionNullTest() { - EntryRelationship entryRelationship = observationHelper(nullLabComponent).getEntryRelationship().get(0); - assertNull(entryRelationship); - } - - @Test - public void commentTest() { - EntryRelationship entryRelationship = observationHelper(labComponent).getEntryRelationship().get(1); - assertNotNull(entryRelationship); - } - - @Test - public void commentNullTest() { - EntryRelationship entryRelationship = observationHelper(nullLabComponent).getEntryRelationship().get(1); - assertNull(entryRelationship); - } - - @Test - public void referenceRangeRangeTest() { - String range = "range"; - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.minimum.toString()); - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.range.toString(), range); - - ArrayList referenceRanges = observationHelper(labComponent).getReferenceRange(); - assertNotNull(referenceRanges); - assertEquals(1, referenceRanges.size()); - assertNotNull(referenceRanges.get(0)); - - ObservationRange observationRange = referenceRanges.get(0).getObservationRange(); - assertNotNull(observationRange); - - CD code = observationRange.getCode(); - assertNotNull(code); - assertEquals(Labs.NORMAL_CODE, code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_NAME, code.getCodeSystemName()); - assertEquals(Labs.NORMAL, code.getDisplayName()); - - ED text = observationRange.getText(); - assertNotNull(text); - assertTrue(new String(text.getData()).contains(range)); - - assertNotNull(observationRange.getValue()); - assertEquals(ST.class, observationRange.getValue().getDataType()); - ST value = (ST) observationRange.getValue(); - assertTrue(value.getValue().contains(range)); - } - - @Test - public void referenceRangeMinTest() { - String min = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.minimum.toString()); - - ArrayList referenceRanges = observationHelper(labComponent).getReferenceRange(); - assertNotNull(referenceRanges); - assertEquals(1, referenceRanges.size()); - assertNotNull(referenceRanges.get(0)); - - ObservationRange observationRange = referenceRanges.get(0).getObservationRange(); - assertNotNull(observationRange); - - CD code = observationRange.getCode(); - assertNotNull(code); - assertEquals(Labs.NORMAL_CODE, code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_NAME, code.getCodeSystemName()); - assertEquals(Labs.NORMAL, code.getDisplayName()); - - ED text = observationRange.getText(); - assertNotNull(text); - assertTrue(new String(text.getData()).contains(min)); - - assertNotNull(observationRange.getValue()); - assertEquals(IVL.class, observationRange.getValue().getDataType()); - @SuppressWarnings("unchecked") - IVL value = (IVL) observationRange.getValue(); - assertEquals(new BigDecimal(min), value.getLow().getValue()); - } - - @Test - public void referenceRangeMaxTest() { - String max = "1234"; - labComponent.getMeasurementsMap().remove(Constants.MeasurementsExtKeys.minimum.toString()); - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.maximum.toString(), max); - - ArrayList referenceRanges = observationHelper(labComponent).getReferenceRange(); - assertNotNull(referenceRanges); - assertEquals(1, referenceRanges.size()); - assertNotNull(referenceRanges.get(0)); - - ObservationRange observationRange = referenceRanges.get(0).getObservationRange(); - assertNotNull(observationRange); - - CD code = observationRange.getCode(); - assertNotNull(code); - assertEquals(Labs.NORMAL_CODE, code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_NAME, code.getCodeSystemName()); - assertEquals(Labs.NORMAL, code.getDisplayName()); - - ED text = observationRange.getText(); - assertNotNull(text); - assertTrue(new String(text.getData()).contains(max)); - - assertNotNull(observationRange.getValue()); - assertEquals(IVL.class, observationRange.getValue().getDataType()); - @SuppressWarnings("unchecked") - IVL value = (IVL) observationRange.getValue(); - assertEquals(new BigDecimal(max), value.getHigh().getValue()); - } - - @Test - public void referenceRangeMinMaxTest() { - String min = labComponent.getMeasurementsMap().get(Constants.MeasurementsExtKeys.minimum.toString()); - String max = "1234"; - labComponent.getMeasurementsMap().put(Constants.MeasurementsExtKeys.maximum.toString(), max); - - ArrayList referenceRanges = observationHelper(labComponent).getReferenceRange(); - assertNotNull(referenceRanges); - assertEquals(1, referenceRanges.size()); - assertNotNull(referenceRanges.get(0)); - - ObservationRange observationRange = referenceRanges.get(0).getObservationRange(); - assertNotNull(observationRange); - - CD code = observationRange.getCode(); - assertNotNull(code); - assertEquals(Labs.NORMAL_CODE, code.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATION_INTERPRETATION_NAME, code.getCodeSystemName()); - assertEquals(Labs.NORMAL, code.getDisplayName()); - - ED text = observationRange.getText(); - assertNotNull(text); - assertTrue(new String(text.getData()).contains(min)); - assertTrue(new String(text.getData()).contains(max)); - - assertNotNull(observationRange.getValue()); - assertEquals(IVL.class, observationRange.getValue().getDataType()); - @SuppressWarnings("unchecked") - IVL value = (IVL) observationRange.getValue(); - assertEquals(new BigDecimal(min), value.getLow().getValue()); - assertEquals(new BigDecimal(max), value.getHigh().getValue()); - } - - @Test - public void referenceRangeNullTest() { - ArrayList referenceRanges = observationHelper(nullLabComponent).getReferenceRange(); - assertNull(referenceRanges); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModelTest.java deleted file mode 100644 index e1518651aa..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/ResultOrganizerModelTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport.LabOrganizer; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; - -public class ResultOrganizerModelTest extends AbstractExportModelTest { - public static ResultOrganizerModel resultOrganizerModel; - - @BeforeClass - public static void beforeClass() { - resultOrganizerModel = new ResultOrganizerModel(); - } - - @Test - public void resultOrganizerActiveTest() { - LabOrganizer labOrganizer = new LabOrganizer(Constants.Runtime.VALID_LAB_NO, "P"); - Organizer organizer = resultOrganizerStructureTestHelper(labOrganizer); - - CS statusCode = organizer.getStatusCode(); - assertEquals(ActStatus.Active, statusCode.getCode()); - } - - @Test - public void resultOrganizerCompleteTest() { - LabOrganizer labOrganizer = new LabOrganizer(Constants.Runtime.VALID_LAB_NO, "F"); - Organizer organizer = resultOrganizerStructureTestHelper(labOrganizer); - - CS statusCode = organizer.getStatusCode(); - assertEquals(ActStatus.Completed, statusCode.getCode()); - } - - @Test - public void resultOrganizerNullTest() { - Organizer organizer = resultOrganizerStructureTestHelper(null); - CS statusCode = organizer.getStatusCode(); - - assertTrue(statusCode.isNull()); - assertEquals(NullFlavor.Unknown, statusCode.getNullFlavor().getCode()); - } - - public Organizer resultOrganizerStructureTestHelper(LabOrganizer labOrganizer) { - EntryRelationship entryRelationship = resultOrganizerModel.getEntryRelationship(labOrganizer); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.TemplateOids.RESULT_ORGANIZER_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Organizer organizer = entryRelationship.getClinicalStatementIfOrganizer(); - assertNotNull(organizer); - assertEquals(x_ActClassDocumentEntryOrganizer.BATTERY, organizer.getClassCode().getCode()); - - if(labOrganizer != null) { - II id = organizer.getId().get(0); - assertNotNull(id); - assertTrue(id.getExtension().contains(Constants.IdPrefixes.LabOBR.toString())); - assertTrue(id.getExtension().contains(labOrganizer.getGroupId().toString())); - } - - CD code = organizer.getCode(); - assertNotNull(code); - assertTrue(code.isNull()); - assertEquals(NullFlavor.Unknown, code.getNullFlavor().getCode()); - - CS statusCode = organizer.getStatusCode(); - assertNotNull(statusCode); - - ArrayList labComponents = organizer.getComponent(); - assertNotNull(labComponents); - assertEquals(1, labComponents.size()); - - return organizer; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModelTest.java deleted file mode 100644 index 8e1d0a0d0a..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/CommentObservationModelTest.java +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeNotNull; - -import java.util.ArrayList; -import java.util.Date; - -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.CommentObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class CommentObservationModelTest { - private static final String test = "test"; - private static final Date time = new Date(); - - @Test - public void commentObservationCommentOnlyTest() { - Observation observation = commentObservationStructureTestHelper(test, null, null); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNull(ivl); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertTrue(authors.isEmpty()); - } - - @Test - public void commentObservationCommentDateTest() { - Observation observation = commentObservationStructureTestHelper(test, time, null); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(time), ivl.getLow()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertTrue(authors.isEmpty()); - } - - @Test - public void commentObservationCommentAuthorTest() { - Observation observation = commentObservationStructureTestHelper(test, null, Constants.Runtime.VALID_PROVIDER.toString()); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNull(ivl); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - } - - @Test - public void commentObservationAllTest() { - Observation observation = commentObservationStructureTestHelper(test, time, Constants.Runtime.VALID_PROVIDER.toString()); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(time), ivl.getLow()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - } - - @Test - public void commentObservationNullTest() { - EntryRelationship entryRelationship = new CommentObservationModel().getEntryRelationship(null, null, null); - assertNull(entryRelationship); - - EntryRelationship entryRelationship2 = new CommentObservationModel().getEntryRelationship(null, new Date(), null); - assertNull(entryRelationship2); - - EntryRelationship entryRelationship3 = new CommentObservationModel().getEntryRelationship(null, null, new String()); - assertNull(entryRelationship3); - - EntryRelationship entryRelationship4 = new CommentObservationModel().getEntryRelationship(null, new Date(), new String()); - assertNull(entryRelationship4); - } - - private Observation commentObservationStructureTestHelper(String comment, Date time, String author) { - assumeNotNull(comment); - - EntryRelationship entryRelationship = new CommentObservationModel().getEntryRelationship(comment, time, author); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.COMMENT_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.COMMENT.toString(), code.getCode()); - - return observation; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModelTest.java deleted file mode 100644 index 775c446bd8..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/DateObservationModelTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.Date; - -import org.junit.Test; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.DateObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class DateObservationModelTest { - @Test - public void validDateObservationTest() { - Date date = new Date(); - - EntryRelationship entryRelationship = new DateObservationModel().getEntryRelationship(date); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.DATE_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertEquals(EverestUtils.buildTSFromDate(date), observation.getEffectiveTime().getLow()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.DATEOBS.toString(), code.getCode()); - } - - @Test - public void nullFlavorDateObservationTest() { - EntryRelationship entryRelationship = new DateObservationModel().getEntryRelationship(null); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModelTest.java deleted file mode 100644 index db33413e26..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/DoseObservationModelTest.java +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.SetOperator; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.PIVL; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.common.dao.DrugDao; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.AbstractExportModelTest; -import org.oscarehr.util.SpringUtils; - -public class DoseObservationModelTest extends AbstractExportModelTest { - public static DrugDao dao; - public static Drug drug; - public static Drug nullDrug; - public static DoseObservationModel doseObservationModel; - - @BeforeClass - public static void beforeClass() { - dao = SpringUtils.getBean(DrugDao.class); - doseObservationModel = new DoseObservationModel(); - } - - @Before - public void before() { - drug = dao.findByDemographicId(Constants.Runtime.VALID_DEMOGRAPHIC).get(0); - nullDrug = new Drug(); - } - - @Test - public void doseObservationStructureTest() { - EntryRelationship entryRelationship = doseObservationModel.getEntryRelationship(drug); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.TemplateOids.DOSE_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - SubstanceAdministration substanceAdministration = entryRelationship.getClinicalStatementIfSubstanceAdministration(); - assertNotNull(substanceAdministration); - assertEquals(x_DocumentSubstanceMood.RQO, substanceAdministration.getMoodCode().getCode()); - - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void doseObservationNullTest() { - EntryRelationship entryRelationship = doseObservationModel.getEntryRelationship(null); - assertNotNull(entryRelationship); - - SubstanceAdministration substanceAdministration = entryRelationship.getClinicalStatementIfSubstanceAdministration(); - assertNotNull(substanceAdministration); - - Consumable consumable = substanceAdministration.getConsumable(); - assertNotNull(consumable); - } - - @Test - public void doseInstructionsTest() { - ED text = substanceAdministrationHelper(drug).getText(); - assertNotNull(text); - } - - @Test - public void doseInstructionsNullTest() { - ED text = substanceAdministrationHelper(nullDrug).getText(); - assertNotNull(text); - } - - @Test - public void durationTest() { - IVL ivl = (IVL) substanceAdministrationHelper(drug).getEffectiveTime().get(0); - assertNotNull(ivl); - assertTrue(IVL.isValidWidthFlavor(ivl)); - assertEquals(drug.getDuration(), ivl.getWidth().getValue().toString()); - assertEquals(drug.getDurUnit(), ivl.getWidth().getUnit()); - } - - @Test - public void durationInvalidTest() { - drug.setDuration("test"); - - IVL ivl = (IVL) substanceAdministrationHelper(drug).getEffectiveTime().get(0); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.Unknown, ivl.getNullFlavor().getCode()); - } - - @Test - public void durationNullTest() { - IVL ivl = (IVL) substanceAdministrationHelper(nullDrug).getEffectiveTime().get(0); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.Unknown, ivl.getNullFlavor().getCode()); - } - - @Test - public void frequencyTest() { - PIVL pivl = (PIVL) substanceAdministrationHelper(drug).getEffectiveTime().get(1); - assertNotNull(pivl); - assertEquals(new PQ(BigDecimal.ONE, Constants.TimeUnit.d.toString()), pivl.getPeriod()); - assertEquals(SetOperator.Intersect, pivl.getOperator()); - assertTrue(pivl.getInstitutionSpecified()); - } - - @Test - public void frequencyInvalidTest() { - drug.setFreqCode("test"); - - PIVL pivl = (PIVL) substanceAdministrationHelper(drug).getEffectiveTime().get(1); - assertNotNull(pivl); - assertTrue(pivl.isNull()); - assertEquals(NullFlavor.Other, pivl.getNullFlavor().getCode()); - } - - @Test - public void frequencyNullTest() { - PIVL pivl = (PIVL) substanceAdministrationHelper(nullDrug).getEffectiveTime().get(1); - assertNotNull(pivl); - assertTrue(pivl.isNull()); - assertEquals(NullFlavor.Unknown, pivl.getNullFlavor().getCode()); - } - - @Test - public void routeTest() { - CE route = substanceAdministrationHelper(drug).getRouteCode(); - assertNotNull(route); - assertEquals(drug.getRoute().toUpperCase(), route.getCode()); - assertEquals(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_OID, route.getCodeSystem()); - assertEquals(Constants.CodeSystems.ROUTE_OF_ADMINISTRATION_NAME, route.getCodeSystemName()); - } - - @Test - public void routeNullTest() { - CE route = substanceAdministrationHelper(nullDrug).getRouteCode(); - assertNull(route); - } - - @Test - public void doseQuantityTest() { - IVL ivl = substanceAdministrationHelper(drug).getDoseQuantity(); - assertNotNull(ivl); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMin()), null), ivl.getLow()); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMax()), null), ivl.getHigh()); - - drug.setUnitName("te st"); - - ivl = substanceAdministrationHelper(drug).getDoseQuantity(); - assertNotNull(ivl); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMin()), "te_st"), ivl.getLow()); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMax()), "te_st"), ivl.getHigh()); - } - - @Test - public void doseQuantityNullTest() { - IVL ivl = substanceAdministrationHelper(drug).getDoseQuantity(); - assertNotNull(ivl); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMin()), null), ivl.getLow()); - assertEquals(new PQ(BigDecimal.valueOf(drug.getTakeMax()), null), ivl.getHigh()); - } - - @Test - public void formTest() { - CE form = substanceAdministrationHelper(drug).getAdministrationUnitCode(); - assertNotNull(form); - assertEquals(Mappings.formCode.get(drug.getDrugForm()), form.getCode()); - assertEquals(Constants.CodeSystems.ADMINISTERABLE_DRUG_FORM_OID, form.getCodeSystem()); - assertEquals(Constants.CodeSystems.ADMINISTERABLE_DRUG_FORM_NAME, form.getCodeSystemName()); - assertEquals(drug.getDrugForm(), form.getDisplayName()); - } - - @Test - public void formNullTest() { - CE form = substanceAdministrationHelper(nullDrug).getAdministrationUnitCode(); - assertNull(form); - } - - public SubstanceAdministration substanceAdministrationHelper(Drug drug) { - EntryRelationship entryRelationship = doseObservationModel.getEntryRelationship(drug); - return entryRelationship.getClinicalStatementIfSubstanceAdministration(); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModelTest.java deleted file mode 100644 index 88b9ef3e90..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/InstructionObservationModelTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.Test; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Participant2; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ParticipantRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PlayingEntity; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.marc.everest.rmim.uv.cdar2.vocabulary.EntityClassRoot; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ParticipationType; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.InstructionObservationModel; - -public class InstructionObservationModelTest { - private static String validString = "test"; - - @Test - public void validInstructionObservationTest() { - EntryRelationship entryRelationship = new InstructionObservationModel().getEntryRelationship(validString); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.INSTRUCTION_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertEquals(validString, new String(observation.getText().getData())); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.INSTRUCT.toString(), code.getCode()); - } - - @Test - public void validParticipantTest() { - EntryRelationship entryRelationship = new InstructionObservationModel().getEntryRelationship(validString); - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - ArrayList participants = observation.getParticipant(); - assertNotNull(participants); - assertEquals(1, participants.size()); - - Participant2 participant = participants.get(0); - assertNotNull(participant); - assertEquals(ParticipationType.PrimaryInformationRecipient, participant.getTypeCode().getCode()); - assertEquals(ContextControl.OverridingPropagating, participant.getContextControlCode().getCode()); - - ParticipantRole role = participant.getParticipantRole(); - assertNotNull(role); - assertEquals(Constants.RoleClass.ROL.toString(), role.getClassCode().getCode()); - - CE code = role.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.ROLE_CLASS_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.ROLE_CLASS_NAME, code.getCodeSystemName()); - assertEquals(Constants.RoleClass.PAT.toString(), code.getCode()); - - PlayingEntity playingEntity = role.getPlayingEntityChoiceIfPlayingEntity(); - assertNotNull(playingEntity); - assertEquals(EntityClassRoot.Person, playingEntity.getClassCode().getCode()); - } - - @Test - public void nullFlavorInstructionObservationTest() { - EntryRelationship entryRelationship = new InstructionObservationModel().getEntryRelationship(null); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModelTest.java deleted file mode 100644 index 57cb3573c6..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/LifestageObservationModelTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.template.observation.LifestageObservationModel; - -public class LifestageObservationModelTest { - @Test - public void lifestageObservationTest() { - String lifeStage = "N"; - - EntryRelationship entryRelationship = new LifestageObservationModel().getEntryRelationship(lifeStage); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.LIFESTAGE_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.LIFEOBS.toString(), code.getCode()); - - assertNotNull(observation.getValue()); - assertEquals(CD.class, observation.getValue().getClass()); - - @SuppressWarnings("unchecked") - CD value = (CD) observation.getValue(); - assertNotNull(value); - assertEquals(Constants.CodeSystems.SNOMED_CT_OID, value.getCodeSystem()); - assertEquals(Constants.CodeSystems.SNOMED_CT_NAME, value.getCodeSystemName()); - assertEquals(Mappings.lifeStageCode.get(lifeStage), value.getCode()); - assertEquals(Mappings.lifeStageName.get(lifeStage), value.getDisplayName()); - } - - @Test - public void nullFlavorLifestageObservationTest() { - EntryRelationship entryRelationship = new LifestageObservationModel().getEntryRelationship(null); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModelTest.java deleted file mode 100644 index 2321d18bad..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/OrderIndicatorObservationModelTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.OrderIndicatorObservationModel; - -public class OrderIndicatorObservationModelTest { - @Test - public void validOrderIndicatorObservationTest() { - EntryRelationship entryRelationship = new OrderIndicatorObservationModel().getEntryRelationship(true); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.ORDER_INDICATOR_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertEquals(BL.class, observation.getValue().getDataType()); - assertTrue(((BL) observation.getValue()).toBoolean()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.PRNIND.toString(), code.getCode()); - } - - @Test - public void nullFlavorOrderIndicatorObservationTest() { - EntryRelationship entryRelationship = new OrderIndicatorObservationModel().getEntryRelationship(null); - assertNull(entryRelationship); - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModelTest.java deleted file mode 100644 index e105603ec3..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReactionObservationModelTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeNotNull; - -import java.util.ArrayList; -import java.util.Date; - -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.ReactionObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ReactionObservationModelTest { - private static final String test = "test"; - private static final Date time = new Date(); - - @Test - public void reasonObservationMinimalTest() { - Observation observation = reactionObservationStructureTestHelper(test, null, null, null); - - IVL ivl = observation.getEffectiveTime(); - assertNull(ivl); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertTrue(authors.isEmpty()); - - ArrayList entryRelationships = observation.getEntryRelationship(); - assertNotNull(entryRelationships); - assertNotNull(entryRelationships.isEmpty()); - } - - @Test - public void reasonObservationAllTest() { - Observation observation = reactionObservationStructureTestHelper(test, time, Constants.Runtime.VALID_PROVIDER.toString(), test); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(time), ivl.getLow()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertEquals(1, authors.size()); - - ArrayList entryRelationships = observation.getEntryRelationship(); - assertNotNull(entryRelationships); - assertEquals(1, entryRelationships.size()); - } - - @Test - public void reasonObservationNullTest() { - EntryRelationship entryRelationship = new ReactionObservationModel().getEntryRelationship(null, null, null, null, null); - assertNull(entryRelationship); - } - - private Observation reactionObservationStructureTestHelper(String reaction, Date time, String author, String severity) { - assumeNotNull(reaction); - - EntryRelationship entryRelationship = new ReactionObservationModel().getEntryRelationship(reaction, time, author, time, severity); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.REACTION_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.REACTOBS.toString(), code.getCode()); - - ED text = observation.getText(); - assertNotNull(text); - assertEquals(reaction, new String(text.getData())); - - ANY value = observation.getValue(); - assertNotNull(value); - assertEquals(CD.class, value.getClass()); - assertTrue(value.isNull()); - assertEquals(NullFlavor.NoInformation, value.getNullFlavor().getCode()); - - return observation; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModelTest.java deleted file mode 100644 index 6f3679b24e..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/ReasonObservationModelTest.java +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeNotNull; - -import java.util.ArrayList; -import java.util.Date; - -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.ReasonObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ReasonObservationModelTest { - private static final String test = "test"; - private static final Date time = new Date(); - - @Test - public void reasonObservationCommentOnlyTest() { - Observation observation = reasonObservationStructureTestHelper(test, null, null); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.NoInformation, ivl.getNullFlavor().getCode()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertTrue(authors.isEmpty()); - } - - @Test - public void reasonObservationCommentDateTest() { - Observation observation = reasonObservationStructureTestHelper(test, time, null); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(time), ivl.getLow()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - assertTrue(authors.isEmpty()); - } - - @Test - public void reasonObservationCommentAuthorTest() { - Observation observation = reasonObservationStructureTestHelper(test, null, Constants.Runtime.VALID_PROVIDER.toString()); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertTrue(ivl.isNull()); - assertEquals(NullFlavor.NoInformation, ivl.getNullFlavor().getCode()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - } - - @Test - public void reasonObservationAllTest() { - Observation observation = reasonObservationStructureTestHelper(test, time, Constants.Runtime.VALID_PROVIDER.toString()); - ED text = observation.getText(); - assertNotNull(text); - assertEquals(test, new String(text.getData())); - - IVL ivl = observation.getEffectiveTime(); - assertNotNull(ivl); - assertEquals(EverestUtils.buildTSFromDate(time), ivl.getLow()); - - ArrayList authors = observation.getAuthor(); - assertNotNull(authors); - } - - @Test - public void reasonObservationNullTest() { - EntryRelationship entryRelationship = new ReasonObservationModel().getEntryRelationship(null, null, null); - assertNull(entryRelationship); - - EntryRelationship entryRelationship2 = new ReasonObservationModel().getEntryRelationship(null, new Date(), null); - assertNull(entryRelationship2); - - EntryRelationship entryRelationship3 = new ReasonObservationModel().getEntryRelationship(null, null, new String()); - assertNull(entryRelationship3); - - EntryRelationship entryRelationship4 = new ReasonObservationModel().getEntryRelationship(null, new Date(), new String()); - assertNull(entryRelationship4); - } - - private Observation reasonObservationStructureTestHelper(String comment, Date time, String author) { - assumeNotNull(comment); - - EntryRelationship entryRelationship = new ReasonObservationModel().getEntryRelationship(comment, time, author); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.REASON_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - SET id = observation.getId(); - assertNotNull(id); - assertTrue(id.isNull()); - assertEquals(NullFlavor.NoInformation, id.getNullFlavor().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.REASON.toString(), code.getCode()); - - ANY value = observation.getValue(); - assertNotNull(value); - assertEquals(CD.class, value.getClass()); - assertTrue(value.isNull()); - assertEquals(NullFlavor.NoInformation, value.getNullFlavor().getCode()); - - return observation; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModelTest.java deleted file mode 100644 index d7de65a934..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/SecondaryCodeICD9ObservationModelTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.SecondaryCodeICD9ObservationModel; - -public class SecondaryCodeICD9ObservationModelTest { - @Test - public void validSecondaryCodeICD9ObservationTest() { - String validString = "250"; - CD value = commonSecondaryCodeICD9ObservationHelper(validString); - assertNotNull(value.getDisplayName()); - assertEquals(Constants.CodeSystems.ICD9_OID, value.getCodeSystem()); - assertEquals(Constants.CodeSystems.ICD9_NAME, value.getCodeSystemName()); - assertEquals(validString, value.getCode()); - } - - @Test - public void nullFlavorSecondaryCodeICD9ObservationTest() { - CD value = commonSecondaryCodeICD9ObservationHelper(null); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @SuppressWarnings("unchecked") - private CD commonSecondaryCodeICD9ObservationHelper(String icd9Value) { - EntryRelationship entryRelationship = new SecondaryCodeICD9ObservationModel().getEntryRelationship(icd9Value); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.HasComponent, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.SECONDARY_CODE_ICD9_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.ICD9CODE.toString(), code.getCode()); - - assertEquals(CD.class, observation.getValue().getDataType()); - CD value = (CD) observation.getValue(); - assertNotNull(value); - return value; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModelTest.java deleted file mode 100644 index 249a65268f..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/SeverityObservationModelTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.model.export.template.observation.SeverityObservationModel; - -public class SeverityObservationModelTest { - @Test - public void severityObservationTest() { - String validString = "3"; - CD value = commonSeverityObservationHelper(validString); - assertEquals(Mappings.allergyTestValue.get(validString), value.getCode()); - assertEquals(Constants.CodeSystems.OBSERVATION_VALUE_OID, value.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATION_VALUE_NAME, value.getCodeSystemName()); - assertEquals(Mappings.allergyTestName.get(validString), value.getDisplayName()); - } - - @Test - public void severityNullObservationTest() { - CD value = commonSeverityObservationHelper(null); - assertTrue(value.isNull()); - assertEquals(NullFlavor.Unknown, value.getNullFlavor().getCode()); - } - - @SuppressWarnings("unchecked") - private CD commonSeverityObservationHelper(String severity) { - EntryRelationship entryRelationship = new SeverityObservationModel().getEntryRelationship(severity); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.SEVERITY_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.SEV.toString(), code.getCode()); - - ANY value = observation.getValue(); - assertNotNull(value); - assertEquals(CD.class, value.getClass()); - return (CD) value; - } -} diff --git a/src/test/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModelTest.java b/src/test/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModelTest.java deleted file mode 100644 index 3cbe83bf02..0000000000 --- a/src/test/java/org/oscarehr/e2e/model/export/template/observation/UnboundObservationModelTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.template.observation; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntryRelationship; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.observation.UnboundObservationModel; - -public class UnboundObservationModelTest { - @Test - public void validUnboundObservationTest() { - String validString = "test"; - ED text = commonUnboundObservationHelper(validString); - assertEquals(validString, new String(text.getData())); - } - - @Test - public void nullFlavorUnboundObservationTest() { - ED text = commonUnboundObservationHelper(null); - assertTrue(text.isNull()); - assertEquals(NullFlavor.NoInformation, text.getNullFlavor().getCode()); - } - - private ED commonUnboundObservationHelper(String value) { - EntryRelationship entryRelationship = new UnboundObservationModel().getEntryRelationship(value); - assertNotNull(entryRelationship); - assertEquals(x_ActRelationshipEntryRelationship.SUBJ, entryRelationship.getTypeCode().getCode()); - assertTrue(entryRelationship.getContextConductionInd().toBoolean()); - assertEquals(Constants.ObservationOids.UNBOUND_OBSERVATION_TEMPLATE_ID, entryRelationship.getTemplateId().get(0).getRoot()); - - Observation observation = entryRelationship.getClinicalStatementIfObservation(); - assertNotNull(observation); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - - CD code = observation.getCode(); - assertNotNull(code); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_OID, code.getCodeSystem()); - assertEquals(Constants.CodeSystems.OBSERVATIONTYPE_CA_PENDING_NAME, code.getCodeSystemName()); - assertEquals(Constants.ObservationType.UNBOUND.toString(), code.getCode()); - - ED text = observation.getText(); - assertNotNull(text); - return text; - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/AbstractPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/AbstractPopulatorTest.java deleted file mode 100644 index 1edd384190..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/AbstractPopulatorTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.junit.BeforeClass; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.common.dao.DaoTestFixtures; -import org.oscarehr.common.dao.utils.SchemaUtils; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.director.E2ECreator; - -public abstract class AbstractPopulatorTest extends DaoTestFixtures { - protected static ClinicalDocument clinicalDocument; - - @BeforeClass - public static void abstractBeforeClass() throws Exception { - SchemaUtils.restoreTable(Constants.Runtime.TABLES); - assertEquals(0, SchemaUtils.loadFileIntoMySQL(Constants.Runtime.E2E_SETUP)); - - clinicalDocument = E2ECreator.createEmrConversionDocument(Constants.Runtime.VALID_DEMOGRAPHIC); - assertNotNull(clinicalDocument); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/PopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/PopulatorTest.java deleted file mode 100644 index 4ba69f2a35..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/PopulatorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.common.dao.DaoTestFixtures; -import org.oscarehr.common.dao.utils.SchemaUtils; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport; - -public class PopulatorTest extends DaoTestFixtures { - @BeforeClass - public static void beforeClass() throws Exception { - SchemaUtils.restoreTable(Constants.Runtime.TABLES); - assertEquals(0, SchemaUtils.loadFileIntoMySQL(Constants.Runtime.E2E_SETUP)); - } - - @Test - public void emptyEmrExportPopulatorTest() { - PatientExport patientExport = new PatientExport(Constants.Runtime.EMPTY_DEMOGRAPHIC); - CE code = Constants.EMRConversionDocument.CODE; - II templateId = new II(Constants.EMRConversionDocument.TEMPLATE_ID); - - AbstractPopulator populator = new EmrExportPopulator(patientExport, code, templateId); - populator.populate(); - assertNotNull(populator); - - ClinicalDocument clinicalDocument = populator.getClinicalDocument(); - assertNotNull(clinicalDocument); - } - - @Test - public void invalidEmrExportPopulatorTest() { - PatientExport patientExport = new PatientExport(Constants.Runtime.INVALID_VALUE); - CE code = Constants.EMRConversionDocument.CODE; - II templateId = new II(Constants.EMRConversionDocument.TEMPLATE_ID); - - AbstractPopulator populator = new EmrExportPopulator(patientExport, code, templateId); - populator.populate(); - assertNotNull(populator); - - ClinicalDocument clinicalDocument = populator.getClinicalDocument(); - assertNull(clinicalDocument); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulatorTest.java deleted file mode 100644 index 8609c8e328..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/AbstractBodyPopulatorTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.BeforeClass; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component3; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Entry; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Section; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActRelationshipEntry; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.common.dao.DaoTestFixtures; -import org.oscarehr.common.dao.utils.SchemaUtils; -import org.oscarehr.e2e.constant.BodyConstants.AbstractBodyConstants; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.director.E2ECreator; - -public abstract class AbstractBodyPopulatorTest extends DaoTestFixtures { - private static ClinicalDocument clinicalDocument; - private static ArrayList components; - - protected static Component3 component; - protected static AbstractBodyConstants bodyConstants; - - @BeforeClass - public static void abstractBeforeClass() throws Exception { - SchemaUtils.restoreTable(Constants.Runtime.TABLES); - assertEquals(0, SchemaUtils.loadFileIntoMySQL(Constants.Runtime.E2E_SETUP)); - } - - // This must be called in the BeforeClass or things will break - protected static void setupClass(AbstractBodyConstants constants) { - clinicalDocument = E2ECreator.createEmrConversionDocument(Constants.Runtime.VALID_DEMOGRAPHIC); - components = clinicalDocument.getComponent().getBodyChoiceIfStructuredBody().getComponent(); - bodyConstants = constants; - - for(Component3 value : components) { - if(value.getSection().getTemplateId().contains(new II(bodyConstants.WITH_ENTRIES_TEMPLATE_ID)) || - value.getSection().getTemplateId().contains(new II(bodyConstants.WITHOUT_ENTRIES_TEMPLATE_ID))) { - component = value; - break; - } - } - } - - protected void componentSectionTest() { - assertEquals(ActRelationshipHasComponent.HasComponent, component.getTypeCode().getCode()); - assertTrue(component.getContextConductionInd().toBoolean()); - - Section section = component.getSection(); - assertNotNull(section); - assertTrue(section.getTemplateId().contains(new II(bodyConstants.WITH_ENTRIES_TEMPLATE_ID)) || - section.getTemplateId().contains(new II(bodyConstants.WITHOUT_ENTRIES_TEMPLATE_ID))); - assertEquals(new CE(bodyConstants.CODE, bodyConstants.CODE_SYSTEM, Constants.CodeSystems.LOINC_NAME, null), section.getCode()); - assertTrue(section.getTitle().getValue().equals(bodyConstants.WITH_ENTRIES_TITLE) || - section.getTitle().getValue().equals(bodyConstants.WITHOUT_ENTRIES_TITLE)); - assertNotNull(section.getText()); - } - - protected void entryCountTest(Integer count) { - Section section = component.getSection(); - assertNotNull(section); - assertEquals(count.intValue(), section.getEntry().size()); - } - - protected void entryStructureTest() { - Section section = component.getSection(); - assertNotNull(section); - assertEquals(x_BasicConfidentialityKind.Normal, section.getConfidentialityCode().getCode()); - - ArrayList entries = section.getEntry(); - assertNotNull(entries); - - Entry entry = entries.get(0); - assertNotNull(entry); - assertEquals(x_ActRelationshipEntry.DRIV, entry.getTypeCode().getCode()); - assertTrue(entry.getTemplateId().contains(new II(bodyConstants.ENTRY_TEMPLATE_ID))); - assertTrue(entry.getContextConductionInd().toBoolean()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulatorTest.java deleted file mode 100644 index 94b8322fc8..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/AdvanceDirectivesPopulatorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.oscarehr.e2e.constant.BodyConstants.AdvanceDirectives; - -public class AdvanceDirectivesPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(AdvanceDirectives.getConstants()); - } - - @Test - public void advanceDirectivesComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void advanceDirectivesEntryCountTest() { - entryCountTest(1); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/AlertsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/AlertsPopulatorTest.java deleted file mode 100644 index 7f01d297fc..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/AlertsPopulatorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.BodyConstants.Alerts; -import org.oscarehr.e2e.extension.ObservationWithConfidentialityCode; - -public class AlertsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Alerts.getConstants()); - } - - @Test - public void alertsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void alertsEntryCountTest() { - entryCountTest(1); - } - - @Test - public void alertsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void alertsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - //assertTrue(clinicalStatement.isPOCD_MT000040UVObservation()); - - ObservationWithConfidentialityCode observation = (ObservationWithConfidentialityCode) clinicalStatement; - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getText()); - assertNotNull(observation.getStatusCode()); - assertNotNull(observation.getEffectiveTime()); - assertNotNull(observation.getConfidentialityCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/AllergiesPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/AllergiesPopulatorTest.java deleted file mode 100644 index fbb642b38f..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/AllergiesPopulatorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Act; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryAct; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentActMood; -import org.oscarehr.e2e.constant.BodyConstants.Allergies; - -public class AllergiesPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Allergies.getConstants()); - } - - @Test - public void allergiesComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void allergiesEntryCountTest() { - entryCountTest(1); - } - - @Test - public void allergiesEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void allergiesClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVAct()); - - Act act = (Act) clinicalStatement; - assertEquals(x_ActClassDocumentEntryAct.Act, act.getClassCode().getCode()); - assertEquals(x_DocumentActMood.Eventoccurrence, act.getMoodCode().getCode()); - assertNotNull(act.getId()); - assertNotNull(act.getCode()); - assertNotNull(act.getStatusCode()); - assertNotNull(act.getEffectiveTime()); - assertNotNull(act.getEntryRelationship()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulatorTest.java deleted file mode 100644 index 0d81825c44..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/ClinicallyMeasuredObservationsPopulatorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActMoodEventOccurrence; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.oscarehr.e2e.constant.BodyConstants.ClinicallyMeasuredObservations; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.PatientExport; - -public class ClinicallyMeasuredObservationsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(ClinicallyMeasuredObservations.getConstants()); - } - - @Test - public void clinicallyMeasuredObservationsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void clinicallyMeasuredObservationsEntryCountTest() { - entryCountTest(6); - } - - @Test - public void clinicallyMeasuredObservationsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void clinicallyMeasuredObservationsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVOrganizer()); - - Organizer organizer = (Organizer) clinicalStatement; - assertEquals(x_ActClassDocumentEntryOrganizer.CLUSTER, organizer.getClassCode().getCode()); - assertEquals(ActMoodEventOccurrence.Eventoccurrence, organizer.getMoodCode().getCode()); - assertNotNull(organizer.getId()); - assertNotNull(organizer.getCode()); - assertNotNull(organizer.getStatusCode()); - assertNotNull(organizer.getComponent()); - assertTrue(organizer.getComponent().size() > 0); - } - - @Test - public void clinicallyMeasuredObservationsNullFlavorTest() { - ClinicallyMeasuredObservationsPopulator cmoPopulator = new ClinicallyMeasuredObservationsPopulator(new PatientExport(Constants.Runtime.INVALID_VALUE)); - assertNull(cmoPopulator.populateNullFlavorClinicalStatement()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/EncounterPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/EncounterPopulatorTest.java deleted file mode 100644 index a89fe8c536..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/EncounterPopulatorTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Encounter; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentEncounterMood; -import org.oscarehr.e2e.constant.BodyConstants.Encounters; - -public class EncounterPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Encounters.getConstants()); - } - - @Test - public void encountersComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void encountersEntryCountTest() { - entryCountTest(6); - } - - @Test - public void encountersEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void encountersClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVEncounter()); - - Encounter encounter = (Encounter) clinicalStatement; - assertEquals(x_DocumentEncounterMood.Eventoccurrence, encounter.getMoodCode().getCode()); - assertNotNull(encounter.getId()); - assertNotNull(encounter.getParticipant()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulatorTest.java deleted file mode 100644 index 5d5878c953..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/FamilyHistoryPopulatorTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActClassObservation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.BodyConstants.FamilyHistory; - -public class FamilyHistoryPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(FamilyHistory.getConstants()); - } - - @Test - public void familyHistoryComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void familyHistoryEntryCountTest() { - entryCountTest(1); - } - - @Test - public void familyHistoryEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void familyHistoryClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVObservation()); - - Observation observation = (Observation) clinicalStatement; - assertEquals(ActClassObservation.OBS, observation.getClassCode().getCode()); - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getEffectiveTime()); - assertNotNull(observation.getValue()); - assertNotNull(observation.getSubject()); - assertNotNull(observation.getEntryRelationship()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulatorTest.java deleted file mode 100644 index 7881683c9b..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/ImmunizationsPopulatorTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.e2e.constant.BodyConstants.Immunizations; - -public class ImmunizationsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Immunizations.getConstants()); - } - - @Test - public void immunizationsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void immunizationsEntryCountTest() { - entryCountTest(3); - } - - @Test - public void immunizationsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void immunizationsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVSubstanceAdministration()); - - SubstanceAdministration substanceAdministration = (SubstanceAdministration) clinicalStatement; - assertEquals(x_DocumentSubstanceMood.Eventoccurrence, substanceAdministration.getMoodCode().getCode()); - assertNotNull(substanceAdministration.getId()); - assertNotNull(substanceAdministration.getEffectiveTime()); - assertNotNull(substanceAdministration.getConsumable()); - assertNotNull(substanceAdministration.getAuthor()); - assertNotNull(substanceAdministration.getParticipant()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/LabsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/LabsPopulatorTest.java deleted file mode 100644 index 16b9565fc7..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/LabsPopulatorTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.BodyConstants.Labs; - -public class LabsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Labs.getConstants()); - } - - @Test - public void labsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void labsEntryCountTest() { - entryCountTest(1); - } - - @Test - public void labsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void labsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVObservation()); - - Observation observation = (Observation) clinicalStatement; - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/MedicationsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/MedicationsPopulatorTest.java deleted file mode 100644 index 54aa169822..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/MedicationsPopulatorTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.SubstanceAdministration; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_DocumentSubstanceMood; -import org.oscarehr.e2e.constant.BodyConstants.Medications; - -public class MedicationsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Medications.getConstants()); - } - - @Test - public void medicationsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void medicationsEntryCountTest() { - entryCountTest(2); - } - - @Test - public void medicationsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void medicationsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVSubstanceAdministration()); - - SubstanceAdministration substanceAdministration = (SubstanceAdministration) clinicalStatement; - assertEquals(x_DocumentSubstanceMood.Eventoccurrence, substanceAdministration.getMoodCode().getCode()); - assertNotNull(substanceAdministration.getId()); - assertNotNull(substanceAdministration.getCode()); - assertNotNull(substanceAdministration.getStatusCode()); - assertNotNull(substanceAdministration.getConsumable()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulatorTest.java deleted file mode 100644 index 2bb11f9099..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/OrdersAndRequestsPopulatorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.oscarehr.e2e.constant.BodyConstants.OrdersAndRequests; - -public class OrdersAndRequestsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(OrdersAndRequests.getConstants()); - } - - @Test - public void ordersAndRequestsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void ordersAndRequestsEntryCountTest() { - entryCountTest(1); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/ProblemsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/ProblemsPopulatorTest.java deleted file mode 100644 index 42f814df66..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/ProblemsPopulatorTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.e2e.constant.BodyConstants.Problems; - -public class ProblemsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(Problems.getConstants()); - } - - @Test - public void problemsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void problemsEntryCountTest() { - entryCountTest(2); - } - - @Test - public void problemsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void problemsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVObservation()); - - Observation observation = (Observation) clinicalStatement; - assertEquals(x_ActMoodDocumentObservation.Eventoccurrence, observation.getMoodCode().getCode()); - assertNotNull(observation.getId()); - assertNotNull(observation.getCode()); - assertNotNull(observation.getStatusCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulatorTest.java deleted file mode 100644 index b70c1c851c..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/body/RiskFactorsPopulatorTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.body; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalStatement; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Organizer; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActMoodEventOccurrence; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActClassDocumentEntryOrganizer; -import org.oscarehr.e2e.constant.BodyConstants.RiskFactors; - -public class RiskFactorsPopulatorTest extends AbstractBodyPopulatorTest { - @BeforeClass - public static void beforeClass() { - setupClass(RiskFactors.getConstants()); - } - - @Test - public void riskFactorsComponentSectionTest() { - componentSectionTest(); - } - - @Test - public void riskFactorsEntryCountTest() { - entryCountTest(1); - } - - @Test - public void riskFactorsEntryStructureTest() { - entryStructureTest(); - } - - @Test - public void riskFactorsClinicalStatementTest() { - ClinicalStatement clinicalStatement = component.getSection().getEntry().get(0).getClinicalStatement(); - assertNotNull(clinicalStatement); - assertTrue(clinicalStatement.isPOCD_MT000040UVOrganizer()); - - Organizer organizer = (Organizer) clinicalStatement; - assertEquals(x_ActClassDocumentEntryOrganizer.CLUSTER, organizer.getClassCode().getCode()); - assertEquals(ActMoodEventOccurrence.Eventoccurrence, organizer.getMoodCode().getCode()); - assertNotNull(organizer.getId()); - assertNotNull(organizer.getCode()); - assertNotNull(organizer.getStatusCode()); - assertNotNull(organizer.getComponent()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/header/AuthorPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/header/AuthorPopulatorTest.java deleted file mode 100644 index ff752254fa..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/header/AuthorPopulatorTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; - -import org.junit.Test; -import org.marc.everest.datatypes.TS; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedAuthor; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ContextControl; -import org.oscarehr.e2e.populator.AbstractPopulatorTest; - -public class AuthorPopulatorTest extends AbstractPopulatorTest { - @Test - public void authorTest() { - ArrayList authors = clinicalDocument.getAuthor(); - assertNotNull(authors); - assertEquals(2, authors.size()); - } - - @Test - public void authorProviderTest() { - Author author = clinicalDocument.getAuthor().get(0); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertFalse(author.getTime().isInvalidDate()); - - TS now = TS.now(); - now.setDateValuePrecision(TS.DAY); - assertTrue(author.getTime().toString().contains(now.toString())); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedPerson()); - } - - @Test - public void authorSystemTest() { - Author author = clinicalDocument.getAuthor().get(1); - assertNotNull(author); - assertEquals(ContextControl.OverridingPropagating, author.getContextControlCode().getCode()); - assertFalse(author.getTime().isInvalidDate()); - - TS now = TS.now(); - now.setDateValuePrecision(TS.DAY); - assertTrue(author.getTime().toString().contains(now.toString())); - - AssignedAuthor assignedAuthor = author.getAssignedAuthor(); - assertNotNull(assignedAuthor); - assertNotNull(assignedAuthor.getAssignedAuthorChoiceIfAssignedAuthoringDevice()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/header/CustodianPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/header/CustodianPopulatorTest.java deleted file mode 100644 index 0a3a97cb94..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/header/CustodianPopulatorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.AssignedCustodian; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Custodian; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.CustodianOrganization; -import org.oscarehr.e2e.populator.AbstractPopulatorTest; - -public class CustodianPopulatorTest extends AbstractPopulatorTest { - @Test - public void custodianTest() { - Custodian custodian = clinicalDocument.getCustodian(); - assertNotNull(custodian); - } - - @Test - public void assignedCustodianTest() { - AssignedCustodian assignedCustodian = clinicalDocument.getCustodian().getAssignedCustodian(); - assertNotNull(assignedCustodian); - } - - @Test - public void custodianOrganizationTest() { - AssignedCustodian assignedCustodian = clinicalDocument.getCustodian().getAssignedCustodian(); - CustodianOrganization custodianOrganization = assignedCustodian.getRepresentedCustodianOrganization(); - assertNotNull(custodianOrganization); - assertNotNull(custodianOrganization.getId()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/header/HeaderPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/header/HeaderPopulatorTest.java deleted file mode 100644 index 076ee75a2d..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/header/HeaderPopulatorTest.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CE; -import org.marc.everest.datatypes.generic.CS; -import org.marc.everest.datatypes.generic.LIST; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.vocabulary.BindingRealm; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_BasicConfidentialityKind; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.populator.AbstractPopulatorTest; -import org.oscarehr.e2e.util.EverestUtils; - -public class HeaderPopulatorTest extends AbstractPopulatorTest { - @Test - public void realmCodeTest() { - SET> realm = clinicalDocument.getRealmCode(); - assertNotNull(realm); - - CS binding = clinicalDocument.getRealmCode().get(0); - assertNotNull(binding); - - BindingRealm code = binding.getCode(); - assertEquals(Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_REALM_CODE,code.getCode()); - assertNull(code.getCodeSystem()); - } - - @Test - public void typeIdTest() { - II typeId = clinicalDocument.getTypeId(); - assertNotNull(typeId); - assertEquals(Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_ID, typeId.getRoot()); - assertEquals(Constants.DocumentHeader.E2E_DTC_CLINICAL_DOCUMENT_TYPE_ID_EXTENSION, typeId.getExtension()); - } - - @Test - public void templateIdTest() { - LIST templateIds = clinicalDocument.getTemplateId(); - assertNotNull(templateIds); - assertEquals(2, templateIds.size()); - assertEquals(Constants.DocumentHeader.TEMPLATE_ID, templateIds.get(0).getRoot()); - assertEquals(new II(Constants.EMRConversionDocument.TEMPLATE_ID), templateIds.get(1)); - } - - @Test - public void idTest() { - II id = clinicalDocument.getId(); - assertNotNull(id); - assertEquals(Constants.Runtime.VALID_DEMOGRAPHIC.toString(), id.getExtension()); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(id.getRoot())); - } - - @Test - public void codeTest() { - CE code = clinicalDocument.getCode(); - assertNotNull(code); - assertEquals(Constants.EMRConversionDocument.CODE, code); - } - - @Test - public void titleTest() { - ST title = clinicalDocument.getTitle(); - assertNotNull(title); - assertFalse(EverestUtils.isNullorEmptyorWhitespace(title.getValue())); - } - - @Test - public void effectiveTimeTest() { - TS effectiveTime = clinicalDocument.getEffectiveTime(); - assertNotNull(effectiveTime); - assertFalse(effectiveTime.isInvalidDate()); - - TS now = TS.now(); - now.setDateValuePrecision(TS.DAY); - assertTrue(effectiveTime.toString().contains(now.toString())); - } - - @Test - public void confidentialityCodeTest() { - CE confidentialityCode = clinicalDocument.getConfidentialityCode(); - assertNotNull(confidentialityCode); - assertEquals(x_BasicConfidentialityKind.Normal, confidentialityCode.getCode()); - } - - @Test - public void languageCodeTest() { - CS languageCode = clinicalDocument.getLanguageCode(); - assertNotNull(languageCode); - assertEquals(Constants.DocumentHeader.LANGUAGE_ENGLISH_CANADIAN, languageCode.getCode()); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulatorTest.java deleted file mode 100644 index ca5567528e..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/header/InformationRecipientPopulatorTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.ArrayList; - -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.InformationRecipient; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.IntendedRecipient; -import org.oscarehr.e2e.populator.AbstractPopulatorTest; - -public class InformationRecipientPopulatorTest extends AbstractPopulatorTest { - @Test - public void informationRecipientTest() { - ArrayList informationRecipients = clinicalDocument.getInformationRecipient(); - assertNotNull(informationRecipients); - assertEquals(1, informationRecipients.size()); - assertNotNull(informationRecipients.get(0)); - } - - @Test - public void intendedRecipientTest() { - IntendedRecipient intendedRecipient = clinicalDocument.getInformationRecipient().get(0).getIntendedRecipient(); - assertNotNull(intendedRecipient); - } -} diff --git a/src/test/java/org/oscarehr/e2e/populator/header/RecordTargetPopulatorTest.java b/src/test/java/org/oscarehr/e2e/populator/header/RecordTargetPopulatorTest.java deleted file mode 100644 index 4086cbe347..0000000000 --- a/src/test/java/org/oscarehr/e2e/populator/header/RecordTargetPopulatorTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.populator.header; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.ArrayList; - -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Patient; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.PatientRole; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.RecordTarget; -import org.oscarehr.e2e.populator.AbstractPopulatorTest; - -public class RecordTargetPopulatorTest extends AbstractPopulatorTest { - @Test - public void recordTargetTest() { - ArrayList recordTargets = clinicalDocument.getRecordTarget(); - assertNotNull(recordTargets); - assertEquals(1, recordTargets.size()); - - RecordTarget recordTarget = recordTargets.get(0); - assertNotNull(recordTarget); - } - - @Test - public void patientRoleTest() { - PatientRole patientRole = clinicalDocument.getRecordTarget().get(0).getPatientRole(); - assertNotNull(patientRole); - } - - @Test - public void patientTest() { - PatientRole patientRole = clinicalDocument.getRecordTarget().get(0).getPatientRole(); - Patient patient = patientRole.getPatient(); - assertNotNull(patient); - } -} diff --git a/src/test/java/org/oscarehr/e2e/util/E2EEverestValidatorTest.java b/src/test/java/org/oscarehr/e2e/util/E2EEverestValidatorTest.java deleted file mode 100644 index 480cfaf03d..0000000000 --- a/src/test/java/org/oscarehr/e2e/util/E2EEverestValidatorTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import static org.junit.Assert.assertFalse; - -import java.io.IOException; -import java.io.OutputStream; - -import org.junit.Test; -import org.marc.everest.formatters.interfaces.IFormatterGraphResult; -import org.marc.everest.formatters.xml.datatypes.r1.DatatypeFormatter; -import org.marc.everest.formatters.xml.its1.XmlIts1Formatter; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; - -public class E2EEverestValidatorTest { - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void instantiationTest() { - new E2EEverestValidator(); - } - - @Test - public void isValidCDATest() { - XmlIts1Formatter fmtr = new XmlIts1Formatter(); - fmtr.setValidateConformance(true); - fmtr.getGraphAides().add(new DatatypeFormatter()); - IFormatterGraphResult details = fmtr.graph(new NullOutputStream(), new ClinicalDocument()); - - assertFalse(E2EEverestValidator.isValidCDA(details)); - } - - // Creates an OutputStream that does nothing - public class NullOutputStream extends OutputStream { - @Override - public void write(int b) throws IOException { - } - } -} diff --git a/src/test/java/org/oscarehr/e2e/util/E2EXSDValidatorTest.java b/src/test/java/org/oscarehr/e2e/util/E2EXSDValidatorTest.java deleted file mode 100644 index 09708edf8f..0000000000 --- a/src/test/java/org/oscarehr/e2e/util/E2EXSDValidatorTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.Scanner; - -import org.junit.BeforeClass; -import org.junit.Test; - -public class E2EXSDValidatorTest { - private static String s; - - @BeforeClass - public static void beforeClass() { - s = new Scanner(E2EXSDValidatorTest.class.getResourceAsStream("/e2e/validatorTest.xml"), "UTF-8").useDelimiter("\\Z").next(); - assertNotNull(s); - assertFalse(s.isEmpty()); - } - - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void instantiationTest() { - new E2EXSDValidator(); - } - - @Test - public void isWellFormedXMLTest() { - assertTrue(E2EXSDValidator.isWellFormedXML(s)); - } - - @Test - public void isWellFormedXMLOnNonWellFormedDocumentTest() { - assertFalse(E2EXSDValidator.isWellFormedXML(s.replace("", ""))); - } - - @Test - public void testIsValidXML() { - assertTrue(E2EXSDValidator.isValidXML(s)); - } - - @Test - public void testIsValidXMLOnNonValidDocument() { - assertFalse(E2EXSDValidator.isValidXML(s.replace("DOCSECT", "DOXSECT"))); - } -} diff --git a/src/test/java/org/oscarehr/e2e/util/EverestUtilsTest.java b/src/test/java/org/oscarehr/e2e/util/EverestUtilsTest.java deleted file mode 100644 index c09fd0bdc0..0000000000 --- a/src/test/java/org/oscarehr/e2e/util/EverestUtilsTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.util; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.ClinicalDocument; -import org.oscarehr.common.dao.DaoTestFixtures; -import org.oscarehr.common.dao.utils.SchemaUtils; -import org.oscarehr.e2e.constant.Constants; - -public class EverestUtilsTest extends DaoTestFixtures { - @BeforeClass - public static void beforeClass() throws Exception { - SchemaUtils.restoreTable(Constants.Runtime.TABLES); - assertEquals(0, SchemaUtils.loadFileIntoMySQL(Constants.Runtime.E2E_SETUP)); - } - - @SuppressWarnings("unused") - @Test(expected=UnsupportedOperationException.class) - public void instantiationTest() { - new EverestUtils(); - } - - @Test - public void isNullorEmptyorWhitespaceTest() { - assertTrue(EverestUtils.isNullorEmptyorWhitespace(null)); - assertTrue(EverestUtils.isNullorEmptyorWhitespace("")); - assertTrue(EverestUtils.isNullorEmptyorWhitespace(" ")); - assertFalse(EverestUtils.isNullorEmptyorWhitespace("test")); - } - - @Test - public void generateDocumentToStringTest() { - ClinicalDocument clinicalDocument = new ClinicalDocument(); - assertNotNull(EverestUtils.generateDocumentToString(clinicalDocument, true)); - assertNull(EverestUtils.generateDocumentToString(null, true)); - } - - @Test - public void prettyFormatXMLTest() { - assertNotNull(EverestUtils.prettyFormatXML("", Constants.XML.INDENT)); - assertNull(EverestUtils.prettyFormatXML(null, Constants.XML.INDENT)); - } - - @Test - public void getPreventionTypeTest() { - assertNull(EverestUtils.getPreventionType(null)); - assertNotNull(EverestUtils.preventionTypeCodes); - assertEquals(41, EverestUtils.preventionTypeCodes.size()); - assertEquals("J07CA02", EverestUtils.getPreventionType("DTaP-HBV-IPV-Hib")); - } - - @Test - public void getDemographicProviderNoTest() { - assertNull(EverestUtils.getDemographicProviderNo(Constants.Runtime.INVALID_VALUE.toString())); - assertNotNull(EverestUtils.getDemographicProviderNo(Constants.Runtime.VALID_DEMOGRAPHIC.toString())); - // Test Caching - assertNotNull(EverestUtils.getDemographicProviderNo(Constants.Runtime.VALID_DEMOGRAPHIC.toString())); - } - - @Test - public void getICD9DescriptionTest() { - assertNull(EverestUtils.getICD9Description(null)); - assertNotNull(EverestUtils.getICD9Description("428")); - // Test Caching - assertNotNull(EverestUtils.getICD9Description("428")); - } -} diff --git a/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensiveQueryPlacerTest.java b/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensiveQueryPlacerTest.java deleted file mode 100644 index 9c4c7176ee..0000000000 --- a/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonComprehensiveQueryPlacerTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry; - -import static org.junit.Assert.*; - -import java.util.Calendar; - -import org.junit.Test; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.integration.nclass.clientRegistry.impl.PlaceholderPersonComprehensivePlacer; - -public class PersonComprehensiveQueryPlacerTest { - - private PersonComprehensivePlacer personComprehensivePlacer = new PlaceholderPersonComprehensivePlacer(); - - @Test - public void testAddPerson() { - Demographic demo = new Demographic(); - demo.setFirstName("Nakatika"); - demo.setLastName("Poebalu"); - demo.setBirthDay(Calendar.getInstance()); - - String externalId = personComprehensivePlacer.addPerson(demo); - assertNotNull(externalId); - } - -} diff --git a/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacerTest.java b/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacerTest.java deleted file mode 100644 index cb7592e39b..0000000000 --- a/src/test/java/org/oscarehr/integration/nclass/clientRegistry/PersonRegistryQueryPlacerTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (c) 2001-2002. Department of Family Medicine, McMaster University. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Family Medicine - * McMaster University - * Hamilton - * Ontario, Canada - */ -package org.oscarehr.integration.nclass.clientRegistry; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; - -import java.util.Calendar; - -import org.junit.Test; -import org.oscarehr.common.model.Demographic; -import org.oscarehr.integration.nclass.clientRegistry.impl.PlaceholderPersonRegistryQueryPlacer; -import org.oscarehr.integration.nclass.clientRegistry.model.Candidate; -import org.oscarehr.integration.nclass.clientRegistry.model.PersonDemographics; - -public class PersonRegistryQueryPlacerTest { - - private PersonRegistryQueryPlacer placer = new PlaceholderPersonRegistryQueryPlacer(); - - @Test - public void testFindCandidate() { - Demographic demo = new Demographic(); - demo.setFirstName("John"); - demo.setLastName("Doe"); - demo.setBirthDay(Calendar.getInstance()); - - Candidate candidate = placer.findCandidate(null, demo); - assertNotNull(candidate); - assertNotNull(candidate.getFirst()); - assertNotNull(candidate.getLast()); - assertFalse(candidate.getIds().isEmpty()); - } - - @Test - public void testGetPersonDemographics() { - Demographic demo = new Demographic(); - demo.setFirstName("John"); - demo.setLastName("Doe"); - demo.setBirthDay(Calendar.getInstance()); - - Candidate candidate = placer.findCandidate(null, demo); - PersonDemographics personDemographics = placer.getPersonDemographics(candidate); - assertNotNull(personDemographics); - } - - - -} From 60c4ff24de06740b16681d2dde31176d8b8f4e08 Mon Sep 17 00:00:00 2001 From: Colcamex Resources Inc Date: Sun, 6 Mar 2022 13:05:05 -0800 Subject: [PATCH 3/5] removed additional E2E code --- .../ClinicallyMeasuredObservationsModel.java | 290 ------------------ .../model/export/body/MedicationsModel.java | 180 ----------- 2 files changed, 470 deletions(-) delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java delete mode 100644 src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java deleted file mode 100644 index dc06bc38bf..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/ClinicallyMeasuredObservationsModel.java +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.logging.log4j.Logger; -import org.marc.everest.datatypes.ANY; -import org.marc.everest.datatypes.BL; -import org.marc.everest.datatypes.ED; -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.NullFlavor; -import org.marc.everest.datatypes.PQ; -import org.marc.everest.datatypes.ST; -import org.marc.everest.datatypes.TS; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.IVL; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Author; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Component4; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Observation; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActRelationshipHasComponent; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.marc.everest.rmim.uv.cdar2.vocabulary.x_ActMoodDocumentObservation; -import org.oscarehr.common.model.Measurement; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.constant.Mappings; -import org.oscarehr.e2e.constant.BodyConstants.ClinicallyMeasuredObservations; -import org.oscarehr.e2e.model.export.template.AuthorParticipationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class ClinicallyMeasuredObservationsModel { - private static Logger log = org.oscarehr.util.MiscUtils.getLogger(); - private Measurement measurement; - - private SET ids; - private CD code; - private ActStatus statusCode; - private ArrayList authors; - - public ClinicallyMeasuredObservationsModel(Measurement measurement) { - if(measurement == null) { - this.measurement = new Measurement(); - } else { - this.measurement = measurement; - } - - setIds(); - setCode(); - setStatusCode(); - setAuthor(); - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(EverestUtils.getTypeDescription(measurement.getType()))) { - sb.append(EverestUtils.getTypeDescription(measurement.getType())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getDataField())) { - sb.append(": ".concat(measurement.getDataField())); - } - if(!EverestUtils.isNullorEmptyorWhitespace(Mappings.measurementUnitMap.get(measurement.getType()))) { - sb.append(" ".concat(Mappings.measurementUnitMap.get(measurement.getType()))); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getMeasuringInstruction())) { - sb.append(" (".concat(measurement.getMeasuringInstruction()).concat(")")); - } - if(measurement.getDateObserved() != null) { - sb.append(" ".concat(measurement.getDateObserved().toString())); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.ClinicalMeasuredObservations, measurement.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(); - this.code.setNullFlavor(NullFlavor.NoInformation); - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - this.statusCode = ActStatus.Completed; - } - - public ArrayList getAuthor() { - return authors; - } - - private void setAuthor() { - this.authors = new ArrayList(); - this.authors.add(new AuthorParticipationModel(measurement.getProviderNo()).getAuthor(measurement.getCreateDate())); - } - - public ArrayList getComponents() { - ArrayList components = new ArrayList<>(); - - if(ClinicallyMeasuredObservations.BLOOD_PRESSURE_CODE.equals(measurement.getType())) { - - // Parse Systolic and Diastolic Blood Pressure integers - Pattern pattern = Pattern.compile("\\d+"); - Matcher matcher = pattern.matcher(measurement.getDataField()); - List values = new ArrayList<>(); - while(matcher.find()) { - values.add(Integer.parseInt(matcher.group())); - } - - // Make a deep copy of measurement object - Measurement tempMeasurement = null; - - try - ( - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream out = new ObjectOutputStream(bos) - ) - { - out.writeObject(measurement); - - try - ( - ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())) - ) - { - tempMeasurement = (Measurement) in.readObject(); - } - catch (ClassNotFoundException e) - { - log.error("Error ", e); - } - - } - catch (IOException e) - { - log.error("Error ", e); - } - - if(tempMeasurement != null && values.size() > 0) - { - // Add Systolic Component - tempMeasurement.setType(ClinicallyMeasuredObservations.DIASTOLIC_CODE); - tempMeasurement.setDataField(values.get(0).toString()); - components.add(new ComponentObservation().getComponent(tempMeasurement)); - } - - if(tempMeasurement != null &&values.size() > 1) - { - // Add Diastolic Component - tempMeasurement.setType(ClinicallyMeasuredObservations.SYSTOLIC_CODE); - tempMeasurement.setDataField(values.get(1).toString()); - components.add(new ComponentObservation().getComponent(tempMeasurement)); - } - - } else { - components.add(new ComponentObservation().getComponent(measurement)); - } - - return components; - } - - class ComponentObservation { - private Measurement measurement; - - public Component4 getComponent(Measurement measurement) { - if(measurement == null) { - this.measurement = new Measurement(); - } else { - this.measurement = measurement; - } - - Component4 component = new Component4(ActRelationshipHasComponent.HasComponent, new BL(true)); - Observation observation = new Observation(); - - observation.setMoodCode(x_ActMoodDocumentObservation.Eventoccurrence); - observation.setId(getComponentIds()); - observation.setCode(getComponentCode()); - observation.setText(getComponentText()); - observation.setEffectiveTime(getComponentTime()); - observation.setValue(getComponentValue()); - - component.setClinicalStatement(observation); - return component; - } - - private SET getComponentIds() { - return EverestUtils.buildUniqueId(Constants.IdPrefixes.ClinicalMeasuredObservations, measurement.getId()); - } - - private CD getComponentCode() { - CD code = new CD(); - if(Mappings.measurementCodeMap.get(measurement.getType()) != null) { - code.setCodeEx(Mappings.measurementCodeMap.get(measurement.getType())); - code.setCodeSystem(Constants.CodeSystems.LOINC_OID); - code.setCodeSystemName(Constants.CodeSystems.LOINC_NAME); - code.setCodeSystemVersion(Constants.CodeSystems.LOINC_VERSION); - } else { - code.setNullFlavor(NullFlavor.Unknown); - } - return code; - } - - private ED getComponentText() { - String text = new String(); - if(!EverestUtils.isNullorEmptyorWhitespace(EverestUtils.getTypeDescription(measurement.getType()))) { - text = EverestUtils.getTypeDescription(measurement.getType()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(measurement.getMeasuringInstruction())) { - text = text.concat(" (").concat(measurement.getMeasuringInstruction().concat(")")); - } - - if(!text.isEmpty()) { - return new ED(text); - } - return null; - } - - private IVL getComponentTime() { - IVL ivl = null; - TS startTime = EverestUtils.buildTSFromDate(measurement.getDateObserved(), TS.SECONDNOTIMEZONE); - if(startTime != null) { - ivl = new IVL(startTime, null); - } - - return ivl; - } - - private ANY getComponentValue() { - String dataField = measurement.getDataField(); - String unit = Mappings.measurementUnitMap.get(measurement.getType()); - ANY value = null; - if(!EverestUtils.isNullorEmptyorWhitespace(dataField)) { - if(!EverestUtils.isNullorEmptyorWhitespace(unit)) { - try { - value = new PQ(new BigDecimal(dataField), unit.replaceAll("\\s","_")); - } catch (NumberFormatException e) { - value = new ST(dataField.concat(" ").concat(unit)); - } - } else { - value = new ST(dataField); - } - } - - return value; - } - } -} diff --git a/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java b/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java deleted file mode 100644 index 0350b13616..0000000000 --- a/src/main/java/org/oscarehr/e2e/model/export/body/MedicationsModel.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Copyright (c) 2013-2015. Department of Computer Science, University of Victoria. All Rights Reserved. - * This software is published under the GPL GNU General Public License. - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * This software was written for the - * Department of Computer Science - * LeadLab - * University of Victoria - * Victoria, Canada - */ -package org.oscarehr.e2e.model.export.body; - -import java.util.Calendar; -import java.util.Date; - -import org.marc.everest.datatypes.II; -import org.marc.everest.datatypes.generic.CD; -import org.marc.everest.datatypes.generic.SET; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.Consumable; -import org.marc.everest.rmim.uv.cdar2.pocd_mt000040uv.EntryRelationship; -import org.marc.everest.rmim.uv.cdar2.vocabulary.ActStatus; -import org.oscarehr.common.model.Drug; -import org.oscarehr.e2e.constant.BodyConstants; -import org.oscarehr.e2e.constant.BodyConstants.Medications; -import org.oscarehr.e2e.constant.Constants; -import org.oscarehr.e2e.model.export.template.ConsumableModel; -import org.oscarehr.e2e.model.export.template.MedicationPrescriptionEventModel; -import org.oscarehr.e2e.model.export.template.observation.DateObservationModel; -import org.oscarehr.e2e.model.export.template.observation.UnboundObservationModel; -import org.oscarehr.e2e.util.EverestUtils; - -public class MedicationsModel { - private Drug drug; - - private SET ids; - private CD code; - private ActStatus statusCode; - private Consumable consumable; - private EntryRelationship recordType; - private EntryRelationship lastReviewDate; - private EntryRelationship prescriptionInformation; - - public MedicationsModel(Drug drug) { - if(drug == null) { - this.drug = new Drug(); - } else { - this.drug = drug; - } - - setIds(); - setCode(); - setStatusCode(); - setConsumable(); - setRecordType(); - setLastReviewDate(); - setPrescriptionInformation(); - } - - private Boolean isActiveDrug(Date date) { - try { - // Add a day to date to mark drugs ending "today" as still active - Calendar c = Calendar.getInstance(); - c.setTime(date); - c.add(Calendar.DATE, 1); - - if(new Date().before(c.getTime())) { - return true; - } - } catch (NullPointerException e) { - return false; - } - return false; - } - - public String getTextSummary() { - StringBuilder sb = new StringBuilder(); - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getGenericName())) { - sb.append(drug.getGenericName()); - } else { - sb.append(drug.getBrandName()); - } - - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDosage())) { - sb.append(" " + drug.getDosage()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getFreqCode())) { - sb.append(" " + drug.getFreqCode()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDuration())) { - sb.append(" " + drug.getDuration()); - } - if(!EverestUtils.isNullorEmptyorWhitespace(drug.getDurUnit())) { - sb.append(" " + drug.getDurUnit()); - } - - return sb.toString(); - } - - public SET getIds() { - return ids; - } - - private void setIds() { - this.ids = EverestUtils.buildUniqueId(Constants.IdPrefixes.Medications, drug.getId()); - } - - public CD getCode() { - return code; - } - - private void setCode() { - this.code = new CD(Constants.SubstanceAdministrationType.DRUG.toString(), Constants.CodeSystems.ACT_CODE_CODESYSTEM_OID); - this.code.setCodeSystemName(Constants.CodeSystems.ACT_CODE_CODESYSTEM_NAME); - this.code.setDisplayName(BodyConstants.Medications.DRUG_THERAPY_ACT_NAME); - } - - public ActStatus getStatusCode() { - return statusCode; - } - - private void setStatusCode() { - if(!drug.isArchived() && drug.isLongTerm() || isActiveDrug(drug.getEndDate())) { - this.statusCode = ActStatus.Active; - } else { - this.statusCode = ActStatus.Completed; - } - } - - public Consumable getConsumable() { - return consumable; - } - - private void setConsumable() { - this.consumable = new ConsumableModel().getConsumable(drug); - } - - public EntryRelationship getRecordType() { - return recordType; - } - - private void setRecordType() { - String value; - if(drug.isLongTerm()) { - value = Medications.LONG_TERM; - } else { - value = Medications.SHORT_TERM; - } - this.recordType = new UnboundObservationModel().getEntryRelationship(value); - } - - public EntryRelationship getLastReviewDate() { - return lastReviewDate; - } - - private void setLastReviewDate() { - this.lastReviewDate = new DateObservationModel().getEntryRelationship(drug.getLastUpdateDate()); - } - - public EntryRelationship getPrescriptionInformation() { - return prescriptionInformation; - } - - private void setPrescriptionInformation() { - this.prescriptionInformation = new MedicationPrescriptionEventModel().getEntryRelationship(drug); - } -} From 17ad28751c6c6bd6a4c85c831b6b656ebe980dd5 Mon Sep 17 00:00:00 2001 From: Colcamex Resources Inc Date: Sun, 6 Mar 2022 16:31:29 -0800 Subject: [PATCH 4/5] fix document.abnormal incorrectly set default value causes NULL error --- src/main/java/org/oscarehr/common/model/Document.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/oscarehr/common/model/Document.java b/src/main/java/org/oscarehr/common/model/Document.java index a86447016f..921dd92659 100644 --- a/src/main/java/org/oscarehr/common/model/Document.java +++ b/src/main/java/org/oscarehr/common/model/Document.java @@ -156,8 +156,8 @@ public class Document extends AbstractModel implements Serializable { private Integer numberofpages; @Column(name="appointment_no") private Integer appointmentNo; - @Column(name="abnormal") - private Boolean abnormal; + @Column(name="abnormal", columnDefinition = "integer default 0") + private boolean abnormal; @OneToMany(fetch = FetchType.EAGER) @JoinColumn(name = "document_no", insertable = false, updatable = false) private List reviews = new ArrayList(); @@ -375,9 +375,6 @@ public void setAppointmentNo(Integer appointmentNo) { } public boolean isAbnormal() { - if (abnormal == null) - abnormal = false; - return abnormal; } public void setAbnormal(boolean abnormal) { From e3e836b21efb95694da2763bf61b5dcb66d4307b Mon Sep 17 00:00:00 2001 From: Colcamex Resources Inc Date: Sun, 6 Mar 2022 18:08:11 -0800 Subject: [PATCH 5/5] fixed eDocument converter not saving correctly --- .../oscarehr/managers/DocumentManager.java | 321 ++++++++++++------ .../oscarehr/managers/EformDataManager.java | 2 - .../org/oscarehr/managers/NioFileManager.java | 4 +- src/main/java/oscar/dms/ConvertToEdoc.java | 51 +-- 4 files changed, 225 insertions(+), 153 deletions(-) diff --git a/src/main/java/org/oscarehr/managers/DocumentManager.java b/src/main/java/org/oscarehr/managers/DocumentManager.java index 05492ecce6..ceb9b9a1ed 100644 --- a/src/main/java/org/oscarehr/managers/DocumentManager.java +++ b/src/main/java/org/oscarehr/managers/DocumentManager.java @@ -32,6 +32,7 @@ import java.nio.file.StandardCopyOption; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -50,6 +51,7 @@ import oscar.OscarProperties; import oscar.dms.EDoc; +import oscar.dms.EDocUtil; import oscar.log.LogAction; @Service @@ -62,13 +64,9 @@ public class DocumentManager { @Autowired private CtlDocumentDao ctlDocumentDao; - - @Autowired - protected SecurityInfoManager securityInfoManager; @Autowired - - private PatientConsentManager patientConsentManager; + protected SecurityInfoManager securityInfoManager; @Autowired private ProviderInboxRoutingDao providerInboxRoutingDao; @@ -79,73 +77,63 @@ public class DocumentManager { @Autowired private PatientLabRoutingDao patientLabRoutingDao; - public Document getDocument(LoggedInInfo loggedInInfo, Integer id) - { - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "r", "" ) ) { - throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } - - Document result=documentDao.find(id); - + public Document getDocument(LoggedInInfo loggedInInfo, Integer id) { + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "r", "")) { + throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } + + Document result = documentDao.find(id); + //--- log action --- if (result != null) { - LogAction.addLog(loggedInInfo, "DocumentManager.getDocument", "id=" + id, "","",""); + LogAction.addLog(loggedInInfo, "DocumentManager.getDocument", "id=" + id, "", "", ""); } - return(result); + return (result); } - - public List getDocumentsByDemographicNo(LoggedInInfo loggedInInfo, Integer demographicNo) - { - List result = documentDao.findByDemographicId(demographicNo+""); - + + public List getDocumentsByDemographicNo(LoggedInInfo loggedInInfo, Integer demographicNo) { + List result = documentDao.findByDemographicId(demographicNo + ""); + //--- log action --- if (result != null) { - LogAction.addLog(loggedInInfo, "DocumentManager.getDocumentsByDemographicNo", "demographicNo=" + demographicNo, "","",""); + LogAction.addLog(loggedInInfo, "DocumentManager.getDocumentsByDemographicNo", "demographicNo=" + demographicNo, "", "", ""); } return result; } - - public CtlDocument getCtlDocumentByDocumentId(LoggedInInfo loggedInInfo, Integer documentId) - { - - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "r", "" ) ) { - throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } - - CtlDocument result=ctlDocumentDao.getCtrlDocument(documentId); - + + public CtlDocument getCtlDocumentByDocumentId(LoggedInInfo loggedInInfo, Integer documentId) { + + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "r", "")) { + throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } + + CtlDocument result = ctlDocumentDao.getCtrlDocument(documentId); + //--- log action --- if (result != null) { - LogAction.addLog(loggedInInfo, "DocumentManager.getCtlDocumentByDocumentNoAndModule", "id=" + documentId, "","",""); + LogAction.addLog(loggedInInfo, "DocumentManager.getCtlDocumentByDocumentNoAndModule", "id=" + documentId, "", "", ""); } - return(result); - } - - public Document addDocument(LoggedInInfo loggedInInfo, Document document, CtlDocument ctlDocument) { - documentDao.persist(document); - ctlDocument.getId().setDocumentNo(document.getDocumentNo()); - ctlDocumentDao.persist(ctlDocument); - LogAction.addLogSynchronous(loggedInInfo, "DocumentManager.addDocument", "id=" + document.getId()); - return(document); + return (result); } /** * Creates a document and saves it to the provided demographic - * @param loggedInInfo The logged in info of the current user - * @param document Document to create + * + * @param loggedInInfo The logged in info of the current user + * @param document Document to create * @param demographicNo The demographic number to save the document to - * @param providerNo The optional provider number to route the document to - * @param documentData The document byte data + * @param providerNo The optional provider number to route the document to + * @param documentData The document byte data * @return Document record from the database once it has been created * @throws IOException If actions related to getting document data fail */ public Document createDocument(LoggedInInfo loggedInInfo, Document document, Integer demographicNo, String providerNo, byte[] documentData) throws IOException { - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "w", "" ) ) { - throw new RuntimeException("Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "w", "")) { + throw new RuntimeException("Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); } SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyyMMddHHmmss"); @@ -178,11 +166,11 @@ public Document createDocument(LoggedInInfo loggedInInfo, Document document, Int } public List getDocumentsUpdateAfterDate(LoggedInInfo loggedInInfo, Date updatedAfterThisDateExclusive, int itemsToReturn) { - - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "r", "" ) ) { - throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } - + + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "r", "")) { + throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } + List results = documentDao.findByUpdateDate(updatedAfterThisDateExclusive, itemsToReturn); LogAction.addLog(loggedInInfo, "DocumentManager.getUpdateAfterDate", "updatedAfterThisDateExclusive=" + updatedAfterThisDateExclusive, "", "", "Number items " + itemsToReturn); @@ -191,42 +179,42 @@ public List getDocumentsUpdateAfterDate(LoggedInInfo loggedInInfo, Dat } public List getDocumentsByProgramProviderDemographicDate(LoggedInInfo loggedInInfo, Integer programId, String providerNo, Integer demographicId, Calendar updatedAfterThisDateExclusive, int itemsToReturn) { - - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "r", "" ) ) { - throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } - + + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "r", "")) { + throw new RuntimeException("Read Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } + List results = documentDao.findByProgramProviderDemographicUpdateDate(programId, providerNo, demographicId, updatedAfterThisDateExclusive.getTime(), itemsToReturn); - LogAction.addLog(loggedInInfo, "DocumentManager.getDocumentsByProgramProviderDemographicDate", "programId=" + programId, "providerNo="+providerNo, demographicId+"", "updatedAfterThisDateExclusive=" + updatedAfterThisDateExclusive.getTime() ); + LogAction.addLog(loggedInInfo, "DocumentManager.getDocumentsByProgramProviderDemographicDate", "programId=" + programId, "providerNo=" + providerNo, demographicId + "", "updatedAfterThisDateExclusive=" + updatedAfterThisDateExclusive.getTime()); return (results); } - public Integer saveDocument( LoggedInInfo loggedInInfo, EDoc edoc ) { - return this.saveDocument( loggedInInfo, edoc.getDocument(), edoc.getCtlDocument() ); + public Integer saveDocument(LoggedInInfo loggedInInfo, EDoc edoc) { + return this.saveDocument(loggedInInfo, edoc.getDocument(), edoc.getCtlDocument()); } - public Integer saveDocument( LoggedInInfo loggedInInfo, Document document, CtlDocument ctlDocument) { - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "w", "" ) ) { - throw new RuntimeException("Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } + public Integer saveDocument(LoggedInInfo loggedInInfo, Document document, CtlDocument ctlDocument) { + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "w", "")) { + throw new RuntimeException("Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } Integer savedId = null; - - if( document.getId() == null ) { - savedId = addDocument( loggedInInfo, document ); - } else if( document.getId() > 0 ) { - savedId = updateDocument( loggedInInfo, document ); + + if (document.getId() == null) { + savedId = addDocument(loggedInInfo, document); + } else if (document.getId() > 0) { + savedId = updateDocument(loggedInInfo, document); } - - ctlDocument.getId().setDocumentNo( savedId ); - - if( savedId != null ) { - ctlDocumentDao.persist( ctlDocument ); + + ctlDocument.getId().setDocumentNo(savedId); + + if (savedId != null) { + ctlDocumentDao.persist(ctlDocument); } - + return savedId; } @@ -257,65 +245,176 @@ private void saveDocument(Document document, Integer demographicNo, String provi providerLabRoutingDao.persist(providerLabRouting); } } - - private Integer addDocument( LoggedInInfo loggedInInfo, Document document ) { - documentDao.persist( document ); - LogAction.addLog(loggedInInfo, "DocumentManager.saveDocument", "Document saved ", "Document No." + document.getDocumentNo(), "",""); + private Integer addDocument(LoggedInInfo loggedInInfo, Document document) { + + documentDao.persist(document); + LogAction.addLog(loggedInInfo, "DocumentManager.saveDocument", "Document saved ", "Document No." + document.getDocumentNo(), "", ""); return document.getId(); } - - private Integer updateDocument( LoggedInInfo loggedInInfo, Document document ) { - documentDao.merge( document ); - LogAction.addLog(loggedInInfo, "DocumentManager.saveDocument", "Document updated ", "Document No." + document.getDocumentNo(), "",""); + + private Integer updateDocument(LoggedInInfo loggedInInfo, Document document) { + documentDao.merge(document); + LogAction.addLog(loggedInInfo, "DocumentManager.saveDocument", "Document updated ", "Document No." + document.getDocumentNo(), "", ""); return document.getId(); } - - public void moveDocumentToOscarDocuments( LoggedInInfo loggedInInfo, Document document, String fromPath) { - moveDocument( loggedInInfo, document, fromPath, null ); + + public void moveDocumentToOscarDocuments(LoggedInInfo loggedInInfo, Document document, String fromPath) { + moveDocument(loggedInInfo, document, fromPath, null); } - - public void moveDocument( LoggedInInfo loggedInInfo, Document document, String fromPath, String toPath ) { - - if ( ! securityInfoManager.hasPrivilege( loggedInInfo, "_edoc", "x", "" ) ) { - throw new RuntimeException("Read and Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo() ); - } - + + public void moveDocument(LoggedInInfo loggedInInfo, Document document, String fromPath, String toPath) { + + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_edoc", "x", "")) { + throw new RuntimeException("Read and Write Access Denied _edoc for provider " + loggedInInfo.getLoggedInProviderNo()); + } + // move the PDF from the temp location to Oscar's document directory. try { - if( toPath == null ) { + if (toPath == null) { toPath = getParentDirectory(); } + Path from = FileSystems.getDefault().getPath(fromPath, document.getDocfilename()); + Path to = FileSystems.getDefault().getPath(toPath, document.getDocfilename()); + Files.move(from, to, StandardCopyOption.REPLACE_EXISTING); - Path from = FileSystems.getDefault().getPath( String.format("%1$s%2$s%3$s", fromPath, File.separator, document.getDocfilename() ) ); - Path to = FileSystems.getDefault().getPath( String.format("%1$s%2$s%3$s", toPath, File.separator, document.getDocfilename() ) ); - Files.move( from, to, StandardCopyOption.REPLACE_EXISTING ); + LogAction.addLog(loggedInInfo, "EformDataManager.moveDocument", "Document was moved", "Document No." + document.getDocumentNo(), "", fromPath + " to " + toPath); - LogAction.addLog(loggedInInfo, "EformDataManager.moveDocument", "Document was moved", "Document No." + document.getDocumentNo(), "",fromPath + " to " + toPath); - } catch (IOException e) { - MiscUtils.getLogger().error("Document failed move. Id: " + document.getDocumentNo() + " From: " + fromPath + " To: " + toPath , e); - LogAction.addLog(loggedInInfo, "EformDataManager.moveDocument", "Document failed move ", "Document No." + document.getDocumentNo(), "",fromPath + " to " + toPath); + MiscUtils.getLogger().error("Document failed move. Id: " + document.getDocumentNo() + " From: " + fromPath + " To: " + toPath, e); + LogAction.addLog(loggedInInfo, "EformDataManager.moveDocument", "Document failed move ", "Document No." + document.getDocumentNo(), "", fromPath + " to " + toPath); } } - + public static final String getParentDirectory() { return PARENT_DIR; } - - public String getPathToDocument(LoggedInInfo loggedInInfo, int documentId) { + public String getPathToDocument(LoggedInInfo loggedInInfo, int documentId) { Document document = this.getDocument(loggedInInfo, documentId); + String path = null; + + if (document != null) { + path = getFullPathToDocument(document.getDocfilename()); + } + + return path; + } + + public String getFullPathToDocument(String filename) { + String path = OscarProperties.getInstance().getProperty("DOCUMENT_DIR"); - - if(! path.endsWith(File.separator)) { - path = path + File.separator; + + if (!path.endsWith(File.separator)) { + path += File.separator; + } + + path += filename; + + if (!FileSystems.getDefault().getPath(path).toFile().exists()) { + path = null; } - - path = path + document.getDocfilename(); - + return path; } -} + /** + * Fetch by demographic number and given document type + * ie: get only LAB documents for the given demographic number. + */ + public List getDemographicDocumentsByDocumentType(LoggedInInfo loggedInInfo, int demographicNo, DocumentDao.DocumentType documentType) { + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_newCasemgmt.documents", SecurityInfoManager.READ, null)) { + throw new RuntimeException("Access Denied"); + } + + LogAction.addLogSynchronous(loggedInInfo, "DocumentManager.getDemographicDocumentsByDocumentType", "fetching documents of type " + documentType.getName() + " for demographic " + demographicNo); + + return documentDao.findByDemographicAndDoctype(demographicNo, documentType); + } + + public Document getDocumentByDemographicAndFilename(LoggedInInfo loggedInInfo, int demographicNo, String fileName) { + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_newCasemgmt.documents", SecurityInfoManager.READ, null)) { + throw new RuntimeException("Access Denied"); + } + + LogAction.addLogSynchronous(loggedInInfo, "DocumentManager.getDocumentByDemographicAndFilename", "fetching document with filename " + fileName + " for demographic " + demographicNo); + + return documentDao.findByDemographicAndFilename(demographicNo, fileName); + } + + /** + * Add a document to Oscar's document library. + *

+ * This method actually saves the Document contents to the file system. The document resource + * MUST contain valid Base64 encoded document binary data. + * + * @param loggedInInfo + * @param document + * @return + * @throws Exception + */ + public Document addDocument(LoggedInInfo loggedInInfo, Document document, CtlDocument ctlDocument) throws Exception { + if (!securityInfoManager.hasPrivilege(loggedInInfo, "_newCasemgmt.documents", SecurityInfoManager.WRITE, null)) { + throw new RuntimeException("Access Denied"); + } + try { + + // is this new file or an update? + Document existingDocument = getDocumentByDemographicAndFilename(loggedInInfo, ctlDocument.getId().getModuleId(), document.getDocfilename()); + + if (existingDocument != null && existingDocument.getId() != null && existingDocument.getId() > 0) { + document.setDocumentNo(existingDocument.getId()); + } + + // Always write to file system, updates will overwrite. + EDocUtil.writeDocContent(document.getDocfilename(), document.getBase64Binary()); + + /* + * This ensures that all incoming documents contain the highly required default of 0. + * A null here will break other parts of Oscar functionality. + */ + if (document.getNumberofpages() == null) { + document.setNumberofpages(0); + } + + /* + * Get the page count if the document is PDF and the page count is not already given. + * The page count is usually missing in documents that are imported from external sources. + * This method is a catch-all to ensure that the page count is not missed in all PDFs. + */ + if ("application/pdf".equalsIgnoreCase(document.getContenttype()) && document.getNumberofpages() == 0) { + int pagecount = EDocUtil.getPDFPageCount(document.getDocfilename()); + document.setNumberofpages(pagecount); + } + + // save document method handles both new saves and updates + saveDocument(loggedInInfo, document, ctlDocument); + + // confirm success if the file saved correctly. + if (document.getId() != null && document.getId() > 0) { + LogAction.addLogSynchronous(loggedInInfo, "DocumentManager.addDocument", "Document Id: " + document.getId()); + return document; + } + + } catch (Exception e) { + // catch exception, document, and then throw. + LogAction.addLogSynchronous(loggedInInfo, "DocumentManager.addDocument", "Exception thrown during document save: " + e.getMessage()); + throw e; + } + + return null; + } + + public List getProvidersThatHaveAcknowledgedDocument(LoggedInInfo loggedInInfo, Integer documentId) { + List inboxList = providerInboxRoutingDao.getProvidersWithRoutingForDocument("DOC", documentId); + List providerList = new ArrayList(); + for(ProviderInboxItem item: inboxList) { + if(ProviderInboxItem.ACK.equals(item.getStatus())){ + //If this has been acknowledge add the provider_no to the list. + providerList.add(item.getProviderNo()); + } + } + return providerList; + } +} \ No newline at end of file diff --git a/src/main/java/org/oscarehr/managers/EformDataManager.java b/src/main/java/org/oscarehr/managers/EformDataManager.java index 7d32ee9e1c..55da904f05 100644 --- a/src/main/java/org/oscarehr/managers/EformDataManager.java +++ b/src/main/java/org/oscarehr/managers/EformDataManager.java @@ -84,8 +84,6 @@ public Integer saveEformDataAsEDoc( LoggedInInfo loggedInInfo, String fdid ) { if ( ! securityInfoManager.hasPrivilege(loggedInInfo, "_eform", SecurityInfoManager.UPDATE, null)) { throw new RuntimeException("missing required security object (_eform)"); } - - // Integer formid = saveEformData( loggedInInfo, eform ); Integer documentId = null; Integer formid = null; diff --git a/src/main/java/org/oscarehr/managers/NioFileManager.java b/src/main/java/org/oscarehr/managers/NioFileManager.java index 4b6712ad21..ab6a3d6ae2 100644 --- a/src/main/java/org/oscarehr/managers/NioFileManager.java +++ b/src/main/java/org/oscarehr/managers/NioFileManager.java @@ -57,7 +57,7 @@ public final class NioFileManager { private static final String DOCUMENT_CACHE_DIRECTORY = "document_cache"; public static final String DOCUMENT_DIRECTORY = "document"; private static final String TEMP_PDF_DIRECTORY = "tempPDF"; - private static final String DEFAULT_FILE_SUFFIX = ".pdf"; + private static final String DEFAULT_FILE_SUFFIX = "pdf"; private static final String BASE_DOCUMENT_DIR = oscar.OscarProperties.getInstance().getProperty("BASE_DOCUMENT_DIR"); public Path hasCacheVersion2(LoggedInInfo loggedInInfo, String filename, Integer pageNum) { @@ -183,7 +183,7 @@ public Path saveTempFile(final String fileName, ByteArrayOutputStream os, String { fileType = DEFAULT_FILE_SUFFIX; } - Path file = Files.createTempFile(directory, fileName, fileType); + Path file = Files.createFile( Paths.get(directory.toString(), String.format("%1$s.%2$s", fileName, fileType)) ); return Files.write(file, os.toByteArray()); } diff --git a/src/main/java/oscar/dms/ConvertToEdoc.java b/src/main/java/oscar/dms/ConvertToEdoc.java index 4923300c85..a8dfb5ded9 100644 --- a/src/main/java/oscar/dms/ConvertToEdoc.java +++ b/src/main/java/oscar/dms/ConvertToEdoc.java @@ -54,7 +54,9 @@ import org.apache.logging.log4j.Logger; import org.oscarehr.common.model.EFormData; +import org.oscarehr.managers.NioFileManager; import org.oscarehr.util.MiscUtils; +import org.oscarehr.util.SpringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -80,23 +82,21 @@ public class ConvertToEdoc { private static final Logger logger = MiscUtils.getLogger(); - public static final String CUSTOM_STYLESHEET_ID = "pdfMediaStylesheet"; - public static enum DocumentType { eForm, form } + private static enum PathAttribute { src, href } + private static enum FileType { pdf, css, jpeg, png, gif } - private static final String TEMP_PDF_DIRECTORY = "tempPDF"; + public static final String CUSTOM_STYLESHEET_ID = "pdfMediaStylesheet"; private static final String DEFAULT_IMAGE_DIRECTORY = String.format( "%1$s", OscarProperties.getInstance().getProperty( "eform_image" ) ); private static final String DEFAULT_FILENAME = "temporaryPDF"; public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; private static final String DEFAULT_CONTENT_TYPE = "application/pdf"; private static final String SYSTEM_ID = "-1"; - private static final String DEFAULT_FILE_SUFFIX = ".pdf"; - private static enum PathAttribute { src, href } - private static enum FileType { pdf, css, jpeg, png, gif } - private static String contextPath; private static String realPath; + private static NioFileManager nioFileManager = SpringUtils.getBean( NioFileManager.class ); + /** * Convert EForm to EDoc * @@ -114,13 +114,13 @@ public synchronized static final EDoc from( EFormData eform ) { Path path = execute( eformString, filename ); if(Files.isReadable(path)) { - edoc = buildEDoc( filename, + edoc = buildEDoc( path.getFileName().toString(), eform.getSubject(), - eformString, + null, eform.getProviderNo(), demographicNo, DocumentType.eForm, - path.toString()); + path.getParent().toString()); } else { logger.error("Could not read temporary PDF file " + filename); } @@ -178,7 +178,7 @@ public synchronized static final EDoc from( FormTransportContainer formTransport if(Files.isReadable(path)) { edoc = buildEDoc( filename, subject, - htmlString, + null, providerNo, demographicNo, formTransportContainer.getDocumentType(), @@ -227,24 +227,15 @@ private static Path execute( final String eformString, final String filename ) { String correctedDocument = tidyDocument( eformString ); Document document = buildDocument( correctedDocument ); - ByteArrayOutputStream os = new ByteArrayOutputStream(); Path path = null; - try { + try(ByteArrayOutputStream os = new ByteArrayOutputStream()) { renderPDF( document, os ); - path = saveFile( filename, os ); + path = nioFileManager.saveTempFile( filename, os ); } catch (DocumentException e1) { logger.error( "Exception parsing file to PDF. File not saved. ", e1 ); } catch (IOException e) { logger.error("Problem while writing PDF file to filesystem. " + filename, e); - } finally { - if( os != null ) { - try { - os.close(); - } catch (IOException e) { - logger.error( "", e ); - } - } } return path; @@ -263,7 +254,6 @@ private static final String buildFilename( String filename, String demographicNo filename = filename.replaceAll(" ", "_"); filename = String.format("%1$s_%2$s", filename, demographicNo ); filename = String.format("%1$s_%2$s", filename, new Date().getTime() ); - return filename; } @@ -300,21 +290,6 @@ public static EDoc buildEDoc( final String filename, final String subject, final return eDoc; } - /** - * File manager to save final PDF output stream to the file system. - * @throws IOException - * - */ - private static final Path saveFile( final String fileName, ByteArrayOutputStream os ) throws IOException { - - Path directory = Files.createTempDirectory(TEMP_PDF_DIRECTORY + System.currentTimeMillis()); - Path file = Files.createTempFile(directory, fileName, DEFAULT_FILE_SUFFIX); - Path path = Files.write(file, os.toByteArray()); - - return path; - - } - /** * Use the Flying Saucer tools to render a PDF from a * well formed w3c XHTML document