/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package gov.hhs.fha.nhinc.adaptercomponentmpi.hl7parsers; import gov.hhs.fha.nhinc.mpilib.*; import gov.hhs.fha.nhinc.properties.PropertyAccessor; import java.math.BigInteger; import java.util.List; import java.util.TimeZone; import java.util.GregorianCalendar; //import javax.xml.datatype.XMLGregorianCalendar; //import javax.xml.datatype.DatatypeFactory; import javax.xml.bind.JAXBElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hl7.v3.*; /** * * @author Jon Hoppesch */ public class HL7Parser201306 { private static Log log = LogFactory.getLog(HL7Parser201306.class); private static final String PROPERTY_FILE = "adapter"; private static final String PROPERTY_NAME = "assigningAuthorityId"; private static final String DEFAULT_AA_OID = "1.1"; public static PRPAIN201306UV BuildMessageFromMpiPatient(Patient patient, PRPAIN201305UV query) { log.debug("Entering HL7Parser201306.BuildMessageFromMpiPatient method..."); PRPAIN201306UV msg = new PRPAIN201306UV(); // Set up message header fields msg.setITSVersion("XML_1.0"); II id = new II(); try { id.setRoot(PropertyAccessor.getProperty(PROPERTY_FILE, PROPERTY_NAME)); } catch (Exception e) { id.setRoot(DEFAULT_AA_OID); } id.setExtension(MessageIdGenerator.GenerateMessageId()); msg.setId(id); // Set up the creation time string String timestamp = ""; try { GregorianCalendar today = new GregorianCalendar(TimeZone.getTimeZone("GMT")); timestamp = String.valueOf(today.get(GregorianCalendar.YEAR)) + String.valueOf(today.get(GregorianCalendar.MONTH)+1) + String.valueOf(today.get(GregorianCalendar.DAY_OF_MONTH)) + String.valueOf(today.get(GregorianCalendar.HOUR_OF_DAY)) + String.valueOf(today.get(GregorianCalendar.MINUTE)) + String.valueOf(today.get(GregorianCalendar.SECOND)); } catch (Exception e) { log.error("Exception when creating XMLGregorian Date"); log.error(" message: " + e.getMessage()); } TSExplicit creationTime = new TSExplicit(); creationTime.setValue(timestamp); msg.setCreationTime(creationTime); II interactionId = new II(); interactionId.setRoot("2.16.840.1.113883.1.6"); interactionId.setExtension("PRPA_IN201306UV"); msg.setInteractionId(interactionId); CS processingCode = new CS(); processingCode.setCode("P"); msg.setProcessingCode(processingCode); CS processingModeCode = new CS(); processingModeCode.setCode("R"); msg.setProcessingModeCode(processingModeCode); CS ackCode = new CS(); ackCode.setCode("AL"); msg.setAcceptAckCode(ackCode); msg.getAcknowledgement().add(createAck(query)); // Set the receiver and sender msg.getReceiver().add(createReceiver(query.getSender())); msg.setSender(createSender(query.getReceiver().get(0))); msg.setControlActProcess(createControlActProcess(patient, query)); log.debug("Exiting HL7Parser201306.BuildMessageFromMpiPatient method..."); return msg; } private static PRPAIN201306UVMFMIMT700711UV01ControlActProcess createControlActProcess(Patient patient, PRPAIN201305UV query) { PRPAIN201306UVMFMIMT700711UV01ControlActProcess controlActProcess = new PRPAIN201306UVMFMIMT700711UV01ControlActProcess(); controlActProcess.setMoodCode("EVN"); CD code = new CD(); code.setCode("PRPA_TE201306UV"); code.setCodeSystem("2.16.840.1.113883.1.6"); controlActProcess.setCode(code); controlActProcess.getSubject().add(createSubject(patient, query)); controlActProcess.setQueryAck(createQueryAck(query)); return controlActProcess; } private static MFMIMT700711UV01QueryAck createQueryAck(PRPAIN201305UV query) { MFMIMT700711UV01QueryAck result = new MFMIMT700711UV01QueryAck(); if (query.getControlActProcess() != null && query.getControlActProcess().getQueryByParameter() != null && query.getControlActProcess().getQueryByParameter().getValue() != null && query.getControlActProcess().getQueryByParameter().getValue().getQueryId() != null) { result.setQueryId(query.getControlActProcess().getQueryByParameter().getValue().getQueryId()); } CS respCode = new CS(); respCode.setCode("OK"); result.setQueryResponseCode(respCode); INT totalQuanity = new INT(); totalQuanity.setValue(BigInteger.valueOf(1)); result.setResultTotalQuantity(totalQuanity); INT currQuanity = new INT(); currQuanity.setValue(BigInteger.valueOf(1)); result.setResultCurrentQuantity(currQuanity); INT remainQuanity = new INT(); remainQuanity.setValue(BigInteger.valueOf(0)); result.setResultRemainingQuantity(remainQuanity); return result; } private static PRPAIN201306UVMFMIMT700711UV01Subject1 createSubject(Patient patient, PRPAIN201305UV query) { PRPAIN201306UVMFMIMT700711UV01Subject1 subject = new PRPAIN201306UVMFMIMT700711UV01Subject1(); subject.getTypeCode().add("SUBJ"); subject.setRegistrationEvent(createRegEvent(patient, query)); return subject; } private static PRPAIN201306UVMFMIMT700711UV01RegistrationEvent createRegEvent(Patient patient, PRPAIN201305UV query) { PRPAIN201306UVMFMIMT700711UV01RegistrationEvent regEvent = new PRPAIN201306UVMFMIMT700711UV01RegistrationEvent(); regEvent.getNullFlavor().add("NA"); CS statusCode = new CS(); statusCode.setCode("active"); regEvent.setStatusCode(statusCode); regEvent.setSubject1(createSubject1(patient, query)); regEvent.setCustodian(createCustodian(patient)); return regEvent; } private static MFMIMT700711UV01Custodian createCustodian (Patient patient) { MFMIMT700711UV01Custodian result = new MFMIMT700711UV01Custodian(); result.setAssignedEntity(createAssignEntity(patient)); return result; } private static COCTMT090003UVAssignedEntity createAssignEntity (Patient patient) { COCTMT090003UVAssignedEntity assignedEntity = new COCTMT090003UVAssignedEntity(); II id = new II(); id.setRoot(patient.getIdentifiers().get(0).getOrganizationId()); assignedEntity.getId().add(id); return assignedEntity; } private static PRPAIN201306UVMFMIMT700711UV01Subject2 createSubject1(Patient patient, PRPAIN201305UV query) { PRPAIN201306UVMFMIMT700711UV01Subject2 subject = new PRPAIN201306UVMFMIMT700711UV01Subject2(); // Add in patient subject.setPatient(createPatient(patient, query)); // Add in query parameters if (query.getControlActProcess() != null && query.getControlActProcess().getQueryByParameter() != null && query.getControlActProcess().getQueryByParameter().getValue() != null) { subject.setQueryByParameter(query.getControlActProcess().getQueryByParameter().getValue()); } return subject; } private static PRPAMT201310UVPatient createPatient(Patient patient, PRPAIN201305UV query) { PRPAMT201310UVPatient subjectPatient = new PRPAMT201310UVPatient(); subjectPatient.setClassCode("PAT"); // TODO: Temporary value until confirmation can be made on the actual value CS statusCode = new CS(); statusCode.setCode("SD"); subjectPatient.setStatusCode(statusCode); // Add in patient id subjectPatient.getId().add(createSubjectId(patient)); // Add in patient person subjectPatient.setPatientPerson(createPatientPerson(patient, query)); // Add in provider organization subjectPatient.setProviderOrganization(createProviderOrg(patient)); // Add in query match observation subjectPatient.getSubjectOf1().add(createSubjectOf1()); return subjectPatient; } private static PRPAMT201310UVSubject createSubjectOf1 () { PRPAMT201310UVSubject result = new PRPAMT201310UVSubject(); result.setQueryMatchObservation(createQueryMatch()); return result; } private static PRPAMT201310UVQueryMatchObservation createQueryMatch () { PRPAMT201310UVQueryMatchObservation queryMatch = new PRPAMT201310UVQueryMatchObservation(); CD code = new CD(); code.setCode("IHE_PDQ"); queryMatch.setCode(code); INT intValue = new INT(); intValue.setValue(BigInteger.valueOf(100)); queryMatch.setValue(intValue); return queryMatch; } private static JAXBElement createProviderOrg (Patient patient) { COCTMT150003UV03Organization org = new COCTMT150003UV03Organization(); II id = new II(); if (patient.getIdentifiers() != null && patient.getIdentifiers().size() > 0 && patient.getIdentifiers().get(0).getOrganizationId() != null && patient.getIdentifiers().get(0).getOrganizationId().length() > 0) { id.setRoot(patient.getIdentifiers().get(0).getOrganizationId()); } org.getId().add(id); org.getContactParty().add(null); javax.xml.namespace.QName xmlqname = new javax.xml.namespace.QName("urn:hl7-org:v3", "providerOrganization"); JAXBElement result = new JAXBElement(xmlqname, COCTMT150003UV03Organization.class, org); return result; } private static II createSubjectId (Patient patient) { II id = new II(); if (patient.getIdentifiers() != null && patient.getIdentifiers().size() > 0 && patient.getIdentifiers().get(0) != null) { if (patient.getIdentifiers().get(0).getOrganizationId() != null && patient.getIdentifiers().get(0).getOrganizationId().length() > 0) { log.info("Setting Patient Id root in 201306: " + patient.getIdentifiers().get(0).getOrganizationId()); id.setRoot(patient.getIdentifiers().get(0).getOrganizationId()); } if (patient.getIdentifiers().get(0).getId() != null && patient.getIdentifiers().get(0).getId().length() > 0) { log.info("Setting Patient Id extension in 201306: " + patient.getIdentifiers().get(0).getId()); id.setExtension(patient.getIdentifiers().get(0).getId()); } } return id; } private static JAXBElement createPatientPerson (Patient patient, PRPAIN201305UV query) { PRPAMT201310UVPerson person = new PRPAMT201310UVPerson(); // Set the Subject Gender if (patient.getGender() != null && patient.getGender().length() > 0) { person.setAdministrativeGenderCode(createGender(patient)); } // Set the Subject Name person.getName().add(createSubjectName(patient)); // Set the Birth Time if (patient.getDateOfBirth() != null && patient.getDateOfBirth().length() > 0) { person.setBirthTime(createBirthTime(patient)); } // Set the Address if (patient.getAddress() != null) { person.getAddr().add(createAddress(patient)); } // Set the SSN if (patient.getSSN() != null && patient.getSSN().length() > 0) { person.getAsOtherIDs().add(createOtherIds(patient)); } javax.xml.namespace.QName xmlqname = new javax.xml.namespace.QName("urn:hl7-org:v3", "patientPerson"); JAXBElement result = new JAXBElement(xmlqname, PRPAMT201310UVPerson.class, person); return result; } private static ADExplicit createAddress (Patient patient) { org.hl7.v3.ObjectFactory factory = new org.hl7.v3.ObjectFactory(); ADExplicit address = (ADExplicit) (factory.createADExplicit()); List addrlist = address.getContent(); if (patient.getAddress() != null) { if (patient.getAddress().getCity() != null && patient.getAddress().getCity().length() > 0) { AdxpExplicitCity city = new AdxpExplicitCity(); city.setContent(patient.getAddress().getCity()); addrlist.add(factory.createADExplicitCity(city)); } if (patient.getAddress().getState() != null && patient.getAddress().getState().length() > 0) { AdxpExplicitState state = new AdxpExplicitState(); state.setContent(patient.getAddress().getState()); addrlist.add(factory.createADExplicitState(state)); } if (patient.getAddress().getStreet1() != null && patient.getAddress().getStreet1().length() > 0) { AdxpExplicitStreetAddressLine street = new AdxpExplicitStreetAddressLine(); street.setContent(patient.getAddress().getStreet1()); addrlist.add(factory.createADExplicitStreetAddressLine(street)); } if (patient.getAddress().getZip() != null && patient.getAddress().getZip().length() > 0) { AdxpExplicitPostalCode zip = new AdxpExplicitPostalCode(); zip.setContent(patient.getAddress().getZip()); addrlist.add(factory.createADExplicitPostalCode(zip)); } } return address; } private static PRPAMT201310UVOtherIDs createOtherIds (Patient patient) { PRPAMT201310UVOtherIDs otherIds = new PRPAMT201310UVOtherIDs(); // TODO: Temporary assignment until actual value can be determined otherIds.setClassCode("SD"); // Set the SSN if (patient.getSSN() != null && patient.getSSN().length() > 0) { II ssn = new II(); ssn.setExtension(patient.getSSN()); ssn.setRoot("2.16.840.1.113883.4.1"); log.info("Setting Patient SSN in 201306: " + patient.getSSN()); otherIds.getId().add(ssn); } return otherIds; } private static TSExplicit createBirthTime (Patient patient) { TSExplicit birthTime = new TSExplicit(); if (patient.getDateOfBirth() != null && patient.getDateOfBirth().length() > 0) { log.info("Setting Patient Birthday in 201306: " + patient.getDateOfBirth()); birthTime.setValue(patient.getDateOfBirth()); } return birthTime; } private static PNExplicit createSubjectName (Patient patient) { org.hl7.v3.ObjectFactory factory = new org.hl7.v3.ObjectFactory(); PNExplicit name = (PNExplicit) (factory.createPNExplicit()); List namelist = name.getContent(); if (patient.getName().getLastName() != null && patient.getName().getLastName().length() > 0) { EnExplicitFamily familyName = new EnExplicitFamily(); familyName.setPartType("FAM"); familyName.setContent(patient.getName().getLastName()); log.info("Setting Patient Lastname in 201306: " + patient.getName().getLastName()); namelist.add(factory.createPNExplicitFamily(familyName)); } if (patient.getName().getFirstName() != null && patient.getName().getFirstName().length() > 0) { EnExplicitGiven givenName = new EnExplicitGiven(); givenName.setPartType("GIV"); givenName.setContent(patient.getName().getFirstName()); log.info("Setting Patient Firstname in 201306: " + patient.getName().getFirstName()); namelist.add(factory.createPNExplicitGiven(givenName)); } return name; } private static CE createGender (Patient patient) { CE gender = new CE(); if (patient.getGender() != null && patient.getGender().length() > 0) { log.info("Setting Patient Gender in 201306: " + patient.getGender()); gender.setCode(patient.getGender()); } return gender; } private static MCCIMT000300UV01Acknowledgement createAck(PRPAIN201305UV query) { MCCIMT000300UV01Acknowledgement ack = new MCCIMT000300UV01Acknowledgement(); ack.setTypeId(query.getInteractionId()); CS typeCode = new CS(); typeCode.setCode("AA"); ack.setTypeCode(typeCode); return ack; } private static MCCIMT000300UV01Receiver createReceiver(MCCIMT000100UV01Sender querySender) { MCCIMT000300UV01Receiver receiver = new MCCIMT000300UV01Receiver(); receiver.setTypeCode(CommunicationFunctionType.RCV); MCCIMT000300UV01Device device = new MCCIMT000300UV01Device(); device.setDeterminerCode("INSTANCE"); if (querySender.getDevice() != null && querySender.getDevice().getId() != null && querySender.getDevice().getId().size() > 0 && querySender.getDevice().getId().get(0) != null) { device.getId().add(querySender.getDevice().getId().get(0)); } receiver.setDevice(device); return receiver; } private static MCCIMT000300UV01Sender createSender(MCCIMT000100UV01Receiver queryReceiver) { MCCIMT000300UV01Sender sender = new MCCIMT000300UV01Sender(); sender.setTypeCode(CommunicationFunctionType.SND); MCCIMT000300UV01Device device = new MCCIMT000300UV01Device(); device.setDeterminerCode("INSTANCE"); if (queryReceiver.getDevice() != null && queryReceiver.getDevice().getId() != null && queryReceiver.getDevice().getId().size() > 0 && queryReceiver.getDevice().getId().get(0) != null) { device.getId().add(queryReceiver.getDevice().getId().get(0)); } sender.setDevice(device); return sender; } }