use of org.hl7.fhir.r4b.model.Annotation in project dpc-app by CMSgov.
the class ParamResourceFactoryTest method testMismatchedParameterType.
@Test
void testMismatchedParameterType() throws IOException {
final Parameters parameters = new Parameters();
final Patient dummyPatient = new Patient();
parameters.addParameter().setResource(dummyPatient);
final HttpServletRequest mock = Mockito.mock(HttpServletRequest.class);
final ServletInputStream mockStream = Mockito.mock(ServletInputStream.class);
final IParser parser = Mockito.mock(IParser.class);
Mockito.when(parser.parseResource(Mockito.eq(Parameters.class), Mockito.any(InputStream.class))).thenReturn(parameters);
final Injector mockInjector = Mockito.mock(Injector.class);
Mockito.when(mockInjector.getInstance(HttpServletRequest.class)).thenReturn(mock);
Mockito.when(mock.getInputStream()).thenReturn(mockStream);
final Parameter parameter = Mockito.mock(Parameter.class);
final FHIRParameter annotation = Mockito.mock(FHIRParameter.class);
Mockito.when(annotation.name()).thenReturn("");
Mockito.when(parameter.getAnnotation(FHIRParameter.class)).thenReturn(annotation);
Mockito.when(parameter.getRawType()).thenAnswer(answer -> Practitioner.class);
final ParamResourceFactory factory = new ParamResourceFactory(mockInjector, parameter, parser);
final WebApplicationException exception = assertThrows(WebApplicationException.class, factory::provide, "Should throw an exception");
assertAll(() -> assertEquals(HttpStatus.BAD_REQUEST_400, exception.getResponse().getStatus(), "Should be a bad request"), () -> assertEquals("Provided resource must be: `Practitioner`, not `Patient`", exception.getMessage(), "Should have useful message"));
}
use of org.hl7.fhir.r4b.model.Annotation in project MobileAccessGateway by i4mi.
the class Iti65RequestConverter method processDocumentManifest.
/**
* ITI-65: process ListResource resource from Bundle
* @param manifest
* @param submissionSet
*/
private void processDocumentManifest(ListResource manifest, SubmissionSet submissionSet) {
for (Identifier id : manifest.getIdentifier()) {
if (id.getUse() == null || id.getUse().equals(Identifier.IdentifierUse.OFFICIAL)) {
} else if (id.getUse().equals(Identifier.IdentifierUse.USUAL)) {
String uniqueId = noPrefix(id.getValue());
submissionSet.setUniqueId(uniqueId);
}
}
submissionSet.assignEntryUuid();
manifest.setId(submissionSet.getEntryUuid());
Extension designationType = manifest.getExtensionByUrl("http://profiles.ihe.net/ITI/MHD/StructureDefinition/ihe-designationType");
if (designationType != null && designationType.getValue() instanceof CodeableConcept) {
submissionSet.setContentTypeCode(transformCodeableConcept((CodeableConcept) designationType.getValue()));
}
DateTimeType created = manifest.getDateElement();
submissionSet.setSubmissionTime(timestampFromDate(created));
// subject SubmissionSet.patientId
Reference ref = manifest.getSubject();
submissionSet.setPatientId(transformReferenceToIdentifiable(ref, manifest));
// Author
Extension authorRoleExt = manifest.getExtensionByUrl("http://fhir.ch/ig/ch-epr-mhealth/StructureDefinition/ch-ext-author-authorrole");
if (manifest.hasSource() || (authorRoleExt != null)) {
Identifiable identifiable = null;
Reference author = manifest.getSource();
if (authorRoleExt != null) {
Coding coding = authorRoleExt.castToCoding(authorRoleExt.getValue());
if (coding != null) {
identifiable = new Identifiable(coding.getCode(), new AssigningAuthority(noPrefix(coding.getSystem())));
}
}
submissionSet.setAuthor(transformAuthor(author, manifest.getContained(), identifiable));
}
for (Extension recipientExt : manifest.getExtensionsByUrl("http://profiles.ihe.net/ITI/MHD/StructureDefinition/ihe-intendedRecipient")) {
Reference recipientRef = (Reference) recipientExt.getValue();
Resource res = findResource(recipientRef, manifest.getContained());
if (res instanceof Practitioner) {
Recipient recipient = new Recipient();
recipient.setPerson(transform((Practitioner) res));
recipient.setTelecom(transform(((Practitioner) res).getTelecomFirstRep()));
submissionSet.getIntendedRecipients().add(recipient);
} else if (res instanceof Organization) {
Recipient recipient = new Recipient();
recipient.setOrganization(transform((Organization) res));
recipient.setTelecom(transform(((Organization) res).getTelecomFirstRep()));
submissionSet.getIntendedRecipients().add(recipient);
} else if (res instanceof PractitionerRole) {
Recipient recipient = new Recipient();
PractitionerRole role = (PractitionerRole) res;
recipient.setOrganization(transform((Organization) findResource(role.getOrganization(), manifest.getContained())));
recipient.setPerson(transform((Practitioner) findResource(role.getPractitioner(), manifest.getContained())));
recipient.setTelecom(transform(role.getTelecomFirstRep()));
submissionSet.getIntendedRecipients().add(recipient);
} else if (res instanceof Patient) {
Recipient recipient = new Recipient();
recipient.setPerson(transform((Patient) res));
recipient.setTelecom(transform(((Patient) res).getTelecomFirstRep()));
} else if (res instanceof RelatedPerson) {
Recipient recipient = new Recipient();
recipient.setPerson(transform((RelatedPerson) res));
recipient.setTelecom(transform(((RelatedPerson) res).getTelecomFirstRep()));
}
}
Extension source = manifest.getExtensionByUrl("http://profiles.ihe.net/ITI/MHD/StructureDefinition/ihe-sourceId");
if (source != null && source.getValue() instanceof Identifier) {
submissionSet.setSourceId(noPrefix(((Identifier) source.getValue()).getValue()));
}
String title = manifest.getTitle();
if (title != null)
submissionSet.setTitle(localizedString(title));
Annotation note = manifest.getNoteFirstRep();
if (note != null && note.hasText()) {
submissionSet.setComments(localizedString(note.getText()));
}
}
use of org.hl7.fhir.r4b.model.Annotation in project gpconnect-demonstrator by nhsconnect.
the class StructuredAllergyIntoleranceBuilder method buildStructuredAllergyIntolerence.
public Bundle buildStructuredAllergyIntolerence(String NHS, Set<String> practitionerIds, Bundle bundle, Boolean includedResolved) {
List<StructuredAllergyIntoleranceEntity> allergyData = structuredAllergySearch.getAllergyIntollerence(NHS);
ListResource activeList = initiateListResource(NHS, ACTIVE_ALLERGIES_DISPLAY, allergyData);
ListResource resolvedList = initiateListResource(NHS, RESOLVED_ALLERGIES_DISPLAY, allergyData);
// This is patient 5 example 2 only
if (allergyData.size() == 1 && allergyData.get(0).getClinicalStatus().equals(SystemConstants.NO_KNOWN)) {
StructuredAllergyIntoleranceEntity noKnownAllergy = allergyData.get(0);
// #214 had incorrect code and value for no known allergies
CodeableConcept noKnownAllergies = createCoding(SystemURL.VS_LIST_EMPTY_REASON_CODE, NO_CONTENT_RECORDED, NO_CONTENT_RECORDED_DISPLAY);
noKnownAllergies.setText("No Known Allergies");
// activeList.setEmptyReason(noKnownAllergies);
// see spec example 2 no known allergies positively asserted
Reference patient = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyData.get(0).getPatientRef());
String noKnownAllergyId = noKnownAllergy.getGuid();
Reference allergyIntolerance = new Reference("AllergyIntolerance/" + noKnownAllergyId);
Resource noKnownAllergyResource = createNoKnownAllergy(noKnownAllergy);
activeList.setSubject(patient);
// reference to AllergyIntolerance item
activeList.addEntry().setItem(allergyIntolerance);
activeList.setOrderedBy(createCoding(SystemURL.CS_LIST_ORDER, "event-date", "Sorted by Event Date"));
bundle.addEntry().setResource(activeList);
bundle.addEntry().setResource(noKnownAllergyResource);
if (includedResolved) {
resolvedList.setSubject(patient);
resolvedList.setEmptyReason(noKnownAllergies);
bundle.addEntry().setResource(resolvedList);
}
return bundle;
}
for (StructuredAllergyIntoleranceEntity allergyIntoleranceEntity : allergyData) {
AllergyIntolerance allergyIntolerance = new AllergyIntolerance();
allergyIntolerance.setOnset(new DateTimeType(allergyIntoleranceEntity.getOnSetDateTime()));
allergyIntolerance.setMeta(createMeta(SystemURL.SD_CC_ALLERGY_INTOLERANCE));
allergyIntolerance.setId(allergyIntoleranceEntity.getId().toString());
List<Identifier> identifiers = new ArrayList<>();
Identifier identifier1 = new Identifier().setSystem("https://fhir.nhs.uk/Id/cross-care-setting-identifier").setValue(allergyIntoleranceEntity.getGuid());
identifiers.add(identifier1);
allergyIntolerance.setIdentifier(identifiers);
if (allergyIntoleranceEntity.getClinicalStatus().equals(SystemConstants.ACTIVE)) {
allergyIntolerance.setClinicalStatus(AllergyIntoleranceClinicalStatus.ACTIVE);
} else {
allergyIntolerance.setClinicalStatus(AllergyIntoleranceClinicalStatus.RESOLVED);
}
if (allergyIntoleranceEntity.getCategory().equals(SystemConstants.MEDICATION)) {
allergyIntolerance.addCategory(AllergyIntoleranceCategory.MEDICATION);
} else {
allergyIntolerance.addCategory(AllergyIntoleranceCategory.ENVIRONMENT);
}
allergyIntolerance.setVerificationStatus(AllergyIntoleranceVerificationStatus.UNCONFIRMED);
// CODE
codeableConceptBuilder.addConceptCode(SystemConstants.SNOMED_URL, allergyIntoleranceEntity.getConceptCode(), allergyIntoleranceEntity.getConceptDisplay()).addDescription(allergyIntoleranceEntity.getDescCode(), allergyIntoleranceEntity.getDescDisplay()).addTranslation(allergyIntoleranceEntity.getCodeTranslationRef());
allergyIntolerance.setCode(codeableConceptBuilder.build());
codeableConceptBuilder.clear();
allergyIntolerance.setAssertedDate(allergyIntoleranceEntity.getAssertedDate());
Reference patient = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyIntoleranceEntity.getPatientRef());
allergyIntolerance.setPatient(patient);
Annotation noteAnnotation = new Annotation(new StringType(allergyIntoleranceEntity.getNote()));
allergyIntolerance.setNote(Collections.singletonList(noteAnnotation));
AllergyIntoleranceReactionComponent reaction = new AllergyIntoleranceReactionComponent();
// MANIFESTATION
List<CodeableConcept> theManifestation = new ArrayList<>();
codeableConceptBuilder.addConceptCode(SystemConstants.SNOMED_URL, allergyIntoleranceEntity.getManifestationCoding(), allergyIntoleranceEntity.getManifestationDisplay()).addDescription(allergyIntoleranceEntity.getManifestationDescCoding(), allergyIntoleranceEntity.getManifestationDescDisplay()).addTranslation(allergyIntoleranceEntity.getManTranslationRef());
theManifestation.add(codeableConceptBuilder.build());
codeableConceptBuilder.clear();
reaction.setManifestation(theManifestation);
reaction.setDescription(allergyIntoleranceEntity.getNote());
// SEVERITY
try {
reaction.setSeverity(AllergyIntoleranceSeverity.fromCode(allergyIntoleranceEntity.getSeverity()));
} catch (FHIRException e) {
throw OperationOutcomeFactory.buildOperationOutcomeException(new UnprocessableEntityException("Unknown severity: " + allergyIntoleranceEntity.getSeverity()), SystemCode.INVALID_RESOURCE, IssueType.INVALID);
}
// EXPOSURE
CodeableConcept exposureRoute = new CodeableConcept();
reaction.setExposureRoute(exposureRoute);
allergyIntolerance.addReaction(reaction);
// RECORDER
final Reference refValue = new Reference();
final Identifier identifier = new Identifier();
final String recorder = allergyIntoleranceEntity.getRecorder();
// This is just an example to demonstrate using Reference element instead of Identifier element
if (recorder.equals(patient2NhsNo.trim())) {
Reference rec = new Reference(SystemConstants.PATIENT_REFERENCE_URL + allergyIntoleranceEntity.getPatientRef());
allergyIntolerance.setRecorder(rec);
} else if (patientRepository.findByNhsNumber(recorder) != null) {
identifier.setSystem(SystemURL.ID_NHS_NUMBER);
identifier.setValue(recorder);
refValue.setIdentifier(identifier);
allergyIntolerance.setRecorder(refValue);
} else if (practitionerSearch.findPractitionerByUserId(recorder) != null) {
refValue.setReference("Practitioner/" + recorder);
allergyIntolerance.setRecorder(refValue);
practitionerIds.add(recorder);
}
// CLINICAL STATUS
List<Extension> extensions = new ArrayList<>();
if (allergyIntolerance.getClinicalStatus().getDisplay().contains("Active")) {
listResourceBuilder(activeList, allergyIntolerance, false);
bundle.addEntry().setResource(allergyIntolerance);
} else if (allergyIntolerance.getClinicalStatus().getDisplay().equals("Resolved") && includedResolved.equals(true)) {
listResourceBuilder(resolvedList, allergyIntolerance, true);
allergyIntolerance.setLastOccurrence(allergyIntoleranceEntity.getEndDate());
final Extension allergyEndExtension = createAllergyEndExtension(allergyIntoleranceEntity);
extensions.add(allergyEndExtension);
}
if (!extensions.isEmpty()) {
allergyIntolerance.setExtension(extensions);
}
// ASSERTER
Reference asserter = allergyIntolerance.getAsserter();
if (asserter != null && asserter.getReference() != null && asserter.getReference().startsWith("Practitioner")) {
String[] split = asserter.getReference().split("/");
practitionerIds.add(split[1]);
}
}
if (!activeList.hasEntry()) {
addEmptyListNote(activeList);
addEmptyReasonCode(activeList);
}
bundle.addEntry().setResource(activeList);
if (includedResolved && !resolvedList.hasEntry()) {
addEmptyListNote(resolvedList);
addEmptyReasonCode(resolvedList);
}
if (includedResolved) {
bundle.addEntry().setResource(resolvedList);
}
return bundle;
}
use of org.hl7.fhir.r4b.model.Annotation in project gpconnect-demonstrator by nhsconnect.
the class PopulateMedicationBundle method createListEntry.
private ListResource createListEntry(List<MedicationStatementDetail> medicationStatements, String nhsNumber) {
ListResource medicationStatementsList = new ListResource();
// #179 dont populate List.id
// medicationStatementsList.setId(new IdType(1));
medicationStatementsList.setMeta(new Meta().addProfile(SystemURL.SD_GPC_LIST));
medicationStatementsList.setStatus(ListStatus.CURRENT);
// #179 dont populate List.id
// medicationStatementsList.setId(new IdDt(1));
medicationStatementsList.setMode(ListMode.SNAPSHOT);
medicationStatementsList.setTitle(SystemConstants.MEDICATION_LIST);
medicationStatementsList.setCode(new CodeableConcept().addCoding(new Coding(SystemURL.VS_SNOMED, "933361000000108", MEDICATION_LIST)));
medicationStatementsList.setSubject(new Reference(new IdType("Patient", 1L)).setIdentifier(new Identifier().setValue(nhsNumber).setSystem(SystemURL.ID_NHS_NUMBER)));
medicationStatementsList.setDate(new Date());
medicationStatementsList.setOrderedBy(new CodeableConcept().addCoding(new Coding(SystemURL.CS_LIST_ORDER, "event-date", "Sorted by Event Date")));
medicationStatementsList.addExtension(setClinicalSetting());
if (medicationStatements.isEmpty()) {
medicationStatementsList.setEmptyReason(new CodeableConcept().setText(SystemConstants.NO_CONTENT));
medicationStatementsList.setNote(Arrays.asList(new Annotation(new StringType(SystemConstants.INFORMATION_NOT_AVAILABLE))));
}
Set<String> warningCodes = new HashSet<>();
medicationStatements.forEach(statement -> {
Reference statementRef = new Reference(new IdType("MedicationStatement", statement.getId()));
ListEntryComponent listEntryComponent = new ListEntryComponent(statementRef);
medicationStatementsList.addEntry(listEntryComponent);
if (statement.getWarningCode() != null) {
warningCodes.add(statement.getWarningCode());
}
});
WarningCodeExtHelper.addWarningCodeExtensions(warningCodes, medicationStatementsList, patientRepository, medicationStatementRepository, structuredAllergySearch);
return medicationStatementsList;
}
use of org.hl7.fhir.r4b.model.Annotation in project loinc2hpo by monarch-initiative.
the class FhirObservationAnalyzer method getHPO4ObservationOutcome.
/**
* A core function that tries three ways to return a LabTestResultInHPO object:
* first, it tries to return the result through the interpretation field. If it fails,
* second, it tries to return the result through the quantative value, or
* third, it tries to return the retult through the coded value (ordinal Loinc)
* @param loinc2HPOannotationMap
* @param loincIds
* @return
*/
public static LabTestResultInHPO getHPO4ObservationOutcome(HashSet<LoincId> loincIds, Map<LoincId, UniversalLoinc2HPOAnnotation> loinc2HPOannotationMap) {
// first make sure the observation has a valid loinc code; otherwise, we cannot handle it
if (!hasValidLoincCode(loincIds)) {
// TODO: consider handling this as a future project
return null;
}
LoincId loincId = null;
try {
loincId = getLoincIdOfObservation();
} catch (MalformedLoincCodeException e) {
logger.error("malformed loinc code; should never happen");
return null;
} catch (LoincCodeNotFoundException e) {
logger.error("No loinc code was found in the observation; should never happen");
return null;
} catch (UnsupportedCodingSystemException e) {
logger.error("coding system not recognized");
return null;
}
if (!loinc2HPOannotationMap.containsKey(loincId)) {
return null;
}
if (observation.hasInterpretation()) {
logger.debug("enter analyzer using the interpretation field");
try {
// return getHPOFromInterpretation(observation.getInterpretation(), loinc2HPOannotationMap);
HpoTermId4LoincTest hpoterm = new ObservationAnalysisFromInterpretation(getLoincIdOfObservation(), observation.getInterpretation(), loinc2HPOannotationMap).getHPOforObservation();
return new BasicLabTestResultInHPO(hpoterm, null);
} catch (UnrecognizedCodeException e) {
// this means the interpretation code is not recognized
logger.info("The interpretation codes for this loinc code is not annotated; system will try using raw values");
} catch (MalformedLoincCodeException e1) {
// not going to happen
logger.error("malformed loinc code.");
return null;
} catch (LoincCodeNotFoundException e2) {
// not going to happen
logger.error("no loinc code is found in the observation");
return null;
} catch (UnsupportedCodingSystemException e3) {
// not going to happen
logger.error("The interpretation coding system cannot be recognized.");
return null;
} catch (AmbiguousResultsFoundException e) {
logger.error("The observation has conflicting interpretation codes.");
return null;
} catch (AnnotationNotFoundException e) {
logger.error("There is no annotation for the loinc code used in the observation");
}
}
// Qn will have a value field
if (observation.hasValueQuantity()) {
try {
HpoTermId4LoincTest hpoterm = new ObservationAnalysisFromQnValue(loincId, observation, loinc2HPOannotationMap).getHPOforObservation();
if (hpoterm != null)
return new BasicLabTestResultInHPO(hpoterm, null);
} catch (ReferenceNotFoundException e) {
// if there is no reference
logger.error("The observation has no reference field.");
// TODO: make a list of our own references
} catch (AmbiguousReferenceException e) {
logger.info("There are two reference ranges or more");
} catch (UnrecognizedCodeException e) {
logger.error("uncognized coding system");
}
}
// Ord will have a ValueCodeableConcept field
if (observation.hasValueCodeableConcept()) {
try {
HpoTermId4LoincTest hpoterm = null;
hpoterm = new ObservationAnalysisFromCodedValues(loincId, observation.getValueCodeableConcept(), loinc2HPOannotationMap).getHPOforObservation();
if (hpoterm != null)
return new BasicLabTestResultInHPO(hpoterm, null);
} catch (AmbiguousResultsFoundException e) {
logger.error("multiple results are found");
} catch (UnrecognizedCodeException e) {
logger.error("unrecognized codes");
} catch (FHIRException e) {
// not going to happen
logger.error("Could not get HPO term from coded value");
} catch (AnnotationNotFoundException e) {
logger.error("There is no annotation for the loinc code used in the observation");
}
}
// if all the above fails, we cannot do nothing
logger.error("Could not return HPO for observation: " + observation.getId());
return null;
}
Aggregations