protected ListEntryComponent addItemToList(ListResource list, DomainResource ai) throws Exception { list.getContained().add(ai); String n = nextRef(); ai.setId(n); ListEntryComponent item = new ListResource.ListEntryComponent(); list.getEntry().add(item); item.setItem(Factory.makeReference("#"+n)); return item; }
Practitioner p = null; if (uri != null) { ref = Factory.makeReference(uri); p = practitionerCache.get(uri); p.setId(n); r.getContained().add(p); ref = Factory.makeReference("#"+n); } else { ref = Factory.makeReference(addReference(p, "Practitioner", uri));
public Bundle convert(InputStream stream) throws Exception { cda = new CDAUtilities(stream); doc = cda.getElement(); cda.checkTemplateId(doc, "2.16.840.1.113883.10.20.22.1.1"); convert = new Convert(cda, ucumSvc, "Z"); // check it's a CDA/CCD feed = new Bundle(); feed.setMeta(new Meta().setLastUpdatedElement(InstantType.now())); feed.setId(makeUUIDReference()); feed.getMeta().getTag().add(new Coding()); // todo-bundle ("http://hl7.org/fhir/tag", "http://hl7.org/fhir/tag/document", "Document")); // process the header makeDocument(); composition.setSubject(Factory.makeReference(makeSubject())); for (Element e : cda.getChildren(doc, "author")) composition.getAuthor().add(Factory.makeReference(makeAuthor(e))); // todo: data enterer & informant goes in provenance composition.setCustodian(Factory.makeReference(makeOrganization( cda.getDescendent(doc, "custodian/assignedCustodian/representedCustodianOrganization"), "Custodian"))); // todo: informationRecipient for (Element e : cda.getChildren(doc, "legalAuthenticator")) composition.getAttester().add(makeAttester(e, CompositionAttestationMode.LEGAL, "Legal Authenticator")); for (Element e : cda.getChildren(doc, "authenticator")) composition.getAttester().add(makeAttester(e, CompositionAttestationMode.PROFESSIONAL, "Authenticator")); // process the contents // we do this by section - keep the original section order Element body = cda.getDescendent(doc, "component/structuredBody"); processComponentSections(composition.getSection(), body); return feed; }
protected SectionComponent processAdverseReactionsSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element concern = cda.getChild(entry, "act"); if (cda.hasTemplateId(concern, "2.16.840.1.113883.10.20.22.4.30")) { processAllergyProblemAct(list, concern); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(concern)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Allergies, Adverse Reactions, Alerts", makeUUIDReference()))); return s; }
protected SectionComponent processVitalSignsSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element organizer = cda.getlastChild(entry); if (cda.hasTemplateId(organizer, "2.16.840.1.113883.10.20.22.4.26")) { processVitalSignsOrganizer(list, organizer); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(organizer)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Vital Signs", makeUUIDReference()))); return s; }
protected CompositionAttesterComponent makeAttester(Element a1, CompositionAttestationMode mode, String title) throws Exception { Practitioner pr = (Practitioner) ResourceFactory.createResource("Practitioner"); Element ass = cda.getChild(a1, "assignedEntity"); for (Element e : cda.getChildren(ass, "id")) pr.getIdentifier().add(convert.makeIdentifierFromII(e)); for (Element e : cda.getChildren(ass, "addr")) if (pr.getAddress() == null) // just take the first pr.getAddress().add(convert.makeAddressFromAD(e)); for (Element e : cda.getChildren(ass, "telecom")) pr.getTelecom().add(convert.makeContactFromTEL(e)); Element ap = cda.getChild(ass, "assignedPerson"); for (Element e : cda.getChildren(ap, "name")) if (pr.getName() == null) // just take the first pr.addName(convert.makeNameFromEN(e)); CompositionAttesterComponent att = new CompositionAttesterComponent(); att.addMode(mode); att.setTimeElement(convert.makeDateTimeFromTS(cda.getChild(a1,"time"))); att.setParty(Factory.makeReference(addReference(pr, title, makeUUIDReference()))); return att; }
protected void makeDocument() throws Exception { composition = (Composition) ResourceFactory.createResource("Composition"); addReference(composition, "Composition", makeUUIDReference()); Element title = cda.getChild(doc, "title"); composition.setTitle(title.getTextContent()); if (cda.getChild(doc, "setId") != null) { feed.setId(convert.makeURIfromII(cda.getChild(doc, "id"))); composition.setIdentifier(convert.makeIdentifierFromII(cda.getChild(doc, "setId"))); } else composition.setIdentifier(convert.makeIdentifierFromII(cda.getChild(doc, "id"))); // well, we fall back to id composition.setDateElement(convert.makeDateTimeFromTS(cda.getChild(doc, "effectiveTime"))); composition.setType(convert.makeCodeableConceptFromCD(cda.getChild(doc, "code"))); composition.setConfidentiality(convertConfidentiality(cda.getChild(doc, "confidentialityCode"))); if (cda.getChild(doc, "confidentialityCode") != null) composition.setLanguage(cda.getChild(doc, "confidentialityCode").getAttribute("value")); // todo - fix streaming for this Element ee = cda.getChild(doc, "componentOf"); if (ee != null) ee = cda.getChild(ee, "encompassingEncounter"); if (ee != null) { Encounter visit = new Encounter(); for (Element e : cda.getChildren(ee, "id")) visit.getIdentifier().add(convert.makeIdentifierFromII(e)); visit.setPeriod(convert.makePeriodFromIVL(cda.getChild(ee, "effectiveTime"))); composition.getEvent().add(new Composition.CompositionEventComponent()); composition.getEvent().get(0).getCode().add(convert.makeCodeableConceptFromCD(cda.getChild(ee, "code"))); composition.getEvent().get(0).setPeriod(visit.getPeriod()); composition.getEvent().get(0).getDetail().add(Factory.makeReference(addReference(visit, "Encounter", makeUUIDReference()))); } // main todo: fill out the narrative, but before we can do that, we have to convert everything else }
protected SectionComponent processProceduresSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element procedure = cda.getlastChild(entry); if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.14")) { processProcedure(list, procedure, ProcedureType.Procedure); } else if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.13")) { processProcedure(list, procedure, ProcedureType.Observation); } else if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.12")) { processProcedure(list, procedure, ProcedureType.Act); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(procedure)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Procedures", makeUUIDReference()))); return s; }
p.getExtension().add(Factory.newExtension("http://www.healthintersections.com.au/fhir/extensions/implanted-devices", Factory.makeReference(processDevice(participantRole, p)), false)); } else if (cda.hasTemplateId(participantRole, "2.16.840.1.113883.10.20.22.4.32")) { p.getExtension().add(Factory.newExtension("http://www.healthintersections.com.au/fhir/extensions/location", Factory.makeReference(processSDLocation(participantRole, p)), false));
obs.getRelated().add(or); or.setType(ObservationRelationshipType.HASMEMBER); or.setTarget(Factory.makeReference("#"+id)); co.setCode(Factory.newCodeableConcept("11778-8", "http://loinc.org", "Delivery date Estimated")); co.setValue(convert.makeDateTimeFromTS(cda.getChild(dd, "value"))); // not legal, see gForge http://gforge.hl7.org/gf/project/fhir/tracker/?action=TrackerItemEdit&tracker_item_id=3125&start=0
protected SectionComponent processSocialHistorySection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element observation = cda.getlastChild(entry); if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.38")) { processSocialObservation(list, observation, SocialHistoryType.SocialHistory); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.15.3.8")) { processSocialObservation(list, observation, SocialHistoryType.Pregnancy); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.78")) { processSocialObservation(list, observation, SocialHistoryType.SmokingStatus); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.85")) { processSocialObservation(list, observation, SocialHistoryType.TobaccoUse); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(observation)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Procedures", makeUUIDReference()))); return s; }
pat.setManagingOrganization(Factory.makeReference(makeOrganization(cda.getChild(pr, "providerOrganization"), "Provider"))); return addReference(pat, "Subject", makeUUIDReference());
protected void processVitalSignsOrganizer(ListResource list, Element organizer) throws Exception { cda.checkTemplateId(organizer, "2.16.840.1.113883.10.20.22.4.26"); checkNoNegationOrNullFlavor(organizer, "Vital Signs Organizer"); checkNoSubject(organizer, "Vital Signs Organizer"); // moodCode is EVN. Observation obs = new Observation(); addItemToList(list, obs); // SHALL contain at least one [1..*] id (CONF:7282). for (Element e : cda.getChildren(organizer, "id")) obs.getIdentifier().add(convert.makeIdentifierFromII(e)); // SHALL contain exactly one [1..1] code (CONF:19176). // This code SHALL contain exactly one [1..1] @code="46680005" Vital signs (CodeSystem: SNOMED-CT 2.16.840.1.113883.6.96 STATIC) (CONF:19177). obs.setCode(convert.makeCodeableConceptFromCD(cda.getChild(organizer, "code"))); // SHALL contain exactly one [1..1] effectiveTime (CONF:7288). obs.setEffective(convert.makeMatchingTypeFromIVL(cda.getChild(organizer, "effectiveTime"))); // SHALL contain at least one [1..*] component (CONF:7285) such that it // SHALL contain exactly one [1..1] Vital Sign Observation (templateId:2.16.840.1.113883.10.20.22.4.27) (CONF:15946). for (Element e : cda.getChildren(organizer, "component")){ ObservationRelatedComponent ro = new ObservationRelatedComponent(); ro.setType(ObservationRelationshipType.HASMEMBER); ro.setTarget(Factory.makeReference("#"+processVitalSignsObservation(e, list))); } }
protected ListEntryComponent addItemToList(ListResource list, DomainResource ai) throws Exception { list.getContained().add(ai); String n = nextRef(); ai.setId(n); ListEntryComponent item = new ListResource.ListEntryComponent(); list.getEntry().add(item); item.setItem(Factory.makeReference("#"+n)); return item; }
protected SectionComponent processAdverseReactionsSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element concern = cda.getChild(entry, "act"); if (cda.hasTemplateId(concern, "2.16.840.1.113883.10.20.22.4.30")) { processAllergyProblemAct(list, concern); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(concern)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Allergies, Adverse Reactions, Alerts", makeUUIDReference()))); return s; }
protected SectionComponent processVitalSignsSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element organizer = cda.getlastChild(entry); if (cda.hasTemplateId(organizer, "2.16.840.1.113883.10.20.22.4.26")) { processVitalSignsOrganizer(list, organizer); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(organizer)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Vital Signs", makeUUIDReference()))); return s; }
protected CompositionAttesterComponent makeAttester(Element a1, CompositionAttestationMode mode, String title) throws Exception { Practitioner pr = (Practitioner) ResourceFactory.createResource("Practitioner"); Element ass = cda.getChild(a1, "assignedEntity"); for (Element e : cda.getChildren(ass, "id")) pr.getIdentifier().add(convert.makeIdentifierFromII(e)); for (Element e : cda.getChildren(ass, "addr")) if (pr.getAddress() == null) // just take the first pr.getAddress().add(convert.makeAddressFromAD(e)); for (Element e : cda.getChildren(ass, "telecom")) pr.getTelecom().add(convert.makeContactFromTEL(e)); Element ap = cda.getChild(ass, "assignedPerson"); for (Element e : cda.getChildren(ap, "name")) if (pr.getName() == null) // just take the first pr.addName(convert.makeNameFromEN(e)); CompositionAttesterComponent att = new CompositionAttesterComponent(); att.addMode(mode); att.setTimeElement(convert.makeDateTimeFromTS(cda.getChild(a1,"time"))); att.setParty(Factory.makeReference(addReference(pr, title, makeUUIDReference()))); return att; }
protected SectionComponent processProceduresSection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element procedure = cda.getlastChild(entry); if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.14")) { processProcedure(list, procedure, ProcedureType.Procedure); } else if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.13")) { processProcedure(list, procedure, ProcedureType.Observation); } else if (cda.hasTemplateId(procedure, "2.16.840.1.113883.10.20.22.4.12")) { processProcedure(list, procedure, ProcedureType.Act); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(procedure)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Procedures", makeUUIDReference()))); return s; }
protected SectionComponent processSocialHistorySection(Element section) throws Exception { ListResource list = new ListResource(); for (Element entry : cda.getChildren(section, "entry")) { Element observation = cda.getlastChild(entry); if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.38")) { processSocialObservation(list, observation, SocialHistoryType.SocialHistory); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.15.3.8")) { processSocialObservation(list, observation, SocialHistoryType.Pregnancy); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.78")) { processSocialObservation(list, observation, SocialHistoryType.SmokingStatus); } else if (cda.hasTemplateId(observation, "2.16.840.1.113883.10.20.22.4.85")) { processSocialObservation(list, observation, SocialHistoryType.TobaccoUse); } else throw new Exception("Unhandled Section template ids: "+cda.showTemplateIds(observation)); } // todo: text SectionComponent s = new Composition.SectionComponent(); s.setCode(convert.makeCodeableConceptFromCD(cda.getChild(section, "code"))); // todo: check subject s.addEntry(Factory.makeReference(addReference(list, "Procedures", makeUUIDReference()))); return s; }
protected void processVitalSignsOrganizer(ListResource list, Element organizer) throws Exception { cda.checkTemplateId(organizer, "2.16.840.1.113883.10.20.22.4.26"); checkNoNegationOrNullFlavor(organizer, "Vital Signs Organizer"); checkNoSubject(organizer, "Vital Signs Organizer"); // moodCode is EVN. Observation obs = new Observation(); addItemToList(list, obs); // SHALL contain at least one [1..*] id (CONF:7282). for (Element e : cda.getChildren(organizer, "id")) obs.getIdentifier().add(convert.makeIdentifierFromII(e)); // SHALL contain exactly one [1..1] code (CONF:19176). // This code SHALL contain exactly one [1..1] @code="46680005" Vital signs (CodeSystem: SNOMED-CT 2.16.840.1.113883.6.96 STATIC) (CONF:19177). obs.setCode(convert.makeCodeableConceptFromCD(cda.getChild(organizer, "code"))); // SHALL contain exactly one [1..1] effectiveTime (CONF:7288). obs.setEffective(convert.makeMatchingTypeFromIVL(cda.getChild(organizer, "effectiveTime"))); // SHALL contain at least one [1..*] component (CONF:7285) such that it // SHALL contain exactly one [1..1] Vital Sign Observation (templateId:2.16.840.1.113883.10.20.22.4.27) (CONF:15946). for (Element e : cda.getChildren(organizer, "component")){ ObservationRelatedComponent ro = new ObservationRelatedComponent(); ro.setType(ObservationRelationshipType.HASMEMBER); ro.setTarget(Factory.makeReference("#"+processVitalSignsObservation(e, list))); } }