use of org.hl7.fhir.r4.model.DocumentReference in project MobileAccessGateway by i4mi.
the class Iti65RequestConverter method processDocumentReference.
/**
* ITI-65: process DocumentReference resource from Bundle
* @param reference
* @param entry
*/
public void processDocumentReference(DocumentReference reference, DocumentEntry entry) {
if (reference.getIdElement() != null) {
entry.setEntryUuid(reference.getIdElement().getIdPart());
} else {
entry.assignEntryUuid();
reference.setId(entry.getEntryUuid());
}
Identifier masterIdentifier = reference.getMasterIdentifier();
entry.setUniqueId(noPrefix(masterIdentifier.getValue()));
// limitedMetadata -> meta.profile canonical [0..*]
// No action
// availabilityStatus -> status code {DocumentReferenceStatus} [1..1]
// approved -> status=current
// deprecated -> status=superseded
// Other status values are allowed but are not defined in this mapping to XDS.
DocumentReferenceStatus status = reference.getStatus();
switch(status) {
case CURRENT:
entry.setAvailabilityStatus(AvailabilityStatus.APPROVED);
break;
case SUPERSEDED:
entry.setAvailabilityStatus(AvailabilityStatus.DEPRECATED);
break;
default:
throw new InvalidRequestException("Unknown document status");
}
// contentTypeCode -> type CodeableConcept [0..1]
CodeableConcept type = reference.getType();
entry.setTypeCode(transform(type));
// classCode -> category CodeableConcept [0..*]
List<CodeableConcept> category = reference.getCategory();
entry.setClassCode(transform(category));
// patientId -> subject Reference(Patient| Practitioner| Group| Device) [0..1],
Reference subject = reference.getSubject();
entry.setPatientId(transformReferenceToIdentifiable(subject, reference));
// creationTime -> date instant [0..1]
entry.setCreationTime(timestampFromDate(reference.getDateElement()));
// PractitionerRole| Organization| Device| Patient| RelatedPerson) [0..*]
for (Reference authorRef : reference.getAuthor()) {
entry.getAuthors().add(transformAuthor(authorRef, reference.getContained(), null));
}
if (reference.hasAuthenticator()) {
Reference authenticatorRef = reference.getAuthenticator();
Resource authenticator = findResource(authenticatorRef, reference.getContained());
if (authenticator instanceof Practitioner) {
entry.setLegalAuthenticator(transform((Practitioner) authenticator));
} else if (authenticator instanceof PractitionerRole) {
Practitioner practitioner = (Practitioner) findResource(((PractitionerRole) authenticator).getPractitioner(), reference.getContained());
if (practitioner != null)
entry.setLegalAuthenticator(transform(practitioner));
} else
throw new InvalidRequestException("No authenticator of type Organization supported.");
}
// title -> description string [0..1]
String title = reference.getDescription();
if (title != null)
entry.setTitle(localizedString(title));
// confidentialityCode -> securityLabel CodeableConcept [0..*] Note: This
// is NOT the DocumentReference.meta, as that holds the meta tags for the
// DocumentReference itself.
List<CodeableConcept> securityLabels = reference.getSecurityLabel();
transformCodeableConcepts(securityLabels, entry.getConfidentialityCodes());
// mimeType -> content.attachment.contentType [1..1] code [0..1]
DocumentReferenceContentComponent content = reference.getContentFirstRep();
if (content == null)
throw new InvalidRequestException("Missing content field in DocumentReference");
Attachment attachment = content.getAttachment();
if (attachment == null)
throw new InvalidRequestException("Missing attachment field in DocumentReference");
entry.setMimeType(attachment.getContentType());
// languageCode -> content.attachment.language code [0..1]
entry.setLanguageCode(attachment.getLanguage());
// size -> content.attachment.size integer [0..1] The size is calculated
if (attachment.hasSize())
entry.setSize((long) attachment.getSize());
// on the data prior to base64 encoding, if the data is base64 encoded.
// hash -> content.attachment.hash string [0..1]
byte[] hash = attachment.getHash();
if (hash != null)
entry.setHash(Hex.encodeHexString(hash));
// comments -> content.attachment.title string [0..1]
String comments = attachment.getTitle();
if (comments != null)
entry.setComments(localizedString(comments));
// creationTime -> content.attachment.creation dateTime [0..1]
if (attachment.hasCreation()) {
if (entry.getCreationTime() == null)
entry.setCreationTime(timestampFromDate(attachment.getCreationElement()));
else if (!timestampFromDate(attachment.getCreationElement()).equals(entry.getCreationTime()))
throw new InvalidRequestException("DocumentReference.date does not match attachment.creation element");
}
// formatCode -> content.format Coding [0..1]
Coding coding = content.getFormat();
entry.setFormatCode(transform(coding));
DocumentReferenceContextComponent context = reference.getContext();
// Instead: referenceIdList -> related.identifier
for (Reference ref : context.getRelated()) {
Identifiable refId = transformReferenceToIdentifiable(ref, reference);
if (refId != null) {
ReferenceId referenceId = new ReferenceId();
referenceId.setAssigningAuthority(new CXiAssigningAuthority(null, refId.getAssigningAuthority().getUniversalId(), refId.getAssigningAuthority().getUniversalIdType()));
referenceId.setId(refId.getId());
entry.getReferenceIdList().add(referenceId);
}
}
// Currently not mapped
/*for (Reference encounterRef : context.getEncounter()) {
ReferenceId referenceId = new ReferenceId();
Identifiable id = transformReferenceToIdentifiable(encounterRef, reference);
if (id != null) {
referenceId.setIdTypeCode(ReferenceId.ID_TYPE_ENCOUNTER_ID);
referenceId.setId(id.getId());
//referenceId.setAssigningAuthority(new CXiAid.getAssigningAuthority().getUniversalId());
entry.getReferenceIdList().add(referenceId );
}*/
// eventCodeList -> context.event CodeableConcept [0..*]
List<CodeableConcept> events = context.getEvent();
transformCodeableConcepts(events, entry.getEventCodeList());
// serviceStartTime serviceStopTime -> context.period Period [0..1]
Period period = context.getPeriod();
if (period != null) {
entry.setServiceStartTime(timestampFromDate(period.getStartElement()));
entry.setServiceStopTime(timestampFromDate(period.getEndElement()));
}
// healthcareFacilityTypeCode -> context.facilityType CodeableConcept
// [0..1]
entry.setHealthcareFacilityTypeCode(transformCodeableConcept(context.getFacilityType()));
// practiceSettingCode -> context.practiceSetting CodeableConcept [0..1]
entry.setPracticeSettingCode(transformCodeableConcept(context.getPracticeSetting()));
Extension originalRole = reference.getExtensionByUrl("http://fhir.ch/ig/ch-epr-mhealth/StructureDefinition/ch-ext-author-authorrole");
if (originalRole != null) {
if (originalRole.getValue() instanceof Coding) {
Coding value = (Coding) originalRole.getValue();
String system = noPrefix(value.getSystem());
String code = value.getCode();
entry.setExtraMetadata(Collections.singletonMap("urn:e-health-suisse:2020:originalProviderRole", Collections.singletonList(code + "^^^&" + system + "&ISO")));
}
}
Extension deletionStatus = reference.getExtensionByUrl("http://fhir.ch/ig/ch-epr-mhealth/StructureDefinition/ch-ext-deletionstatus");
if (deletionStatus != null) {
if (deletionStatus.getValue() instanceof Coding) {
Coding value = (Coding) deletionStatus.getValue();
String code = value.getCode();
entry.setExtraMetadata(Collections.singletonMap("urn:e-health-suisse:2019:deletionStatus", Collections.singletonList("urn:e-health-suisse:2019:deletionStatus:" + code)));
}
}
// Patient.identifier.use element set to ‘usual’.
if (context.hasSourcePatientInfo()) {
entry.setSourcePatientId(transformReferenceToIdentifiable(context.getSourcePatientInfo(), reference));
entry.setSourcePatientInfo(transformReferenceToPatientInfo(context.getSourcePatientInfo(), reference));
}
}
use of org.hl7.fhir.r4.model.DocumentReference in project MobileAccessGateway by i4mi.
the class Iti65RequestConverter method convert.
/**
* convert ITI-65 to ITI-41 request
* @param requestBundle
* @return
*/
public ProvideAndRegisterDocumentSet convert(@Body Bundle requestBundle) {
SubmissionSet submissionSet = new SubmissionSet();
ProvideAndRegisterDocumentSetBuilder builder = new ProvideAndRegisterDocumentSetBuilder(true, submissionSet);
// create mapping fullUrl -> resource for each resource in bundle
Map<String, Resource> resources = new HashMap<String, Resource>();
ListResource manifestNeu = null;
for (Bundle.BundleEntryComponent requestEntry : requestBundle.getEntry()) {
Resource resource = requestEntry.getResource();
/*if (resource instanceof DocumentManifest) {
manifest = (DocumentManifest) resource;
} else*/
if (resource instanceof DocumentReference) {
resources.put(requestEntry.getFullUrl(), resource);
} else if (resource instanceof ListResource) {
manifestNeu = (ListResource) resource;
// resources.put(requestEntry.getFullUrl(), resource);
} else if (resource instanceof Binary) {
resources.put(requestEntry.getFullUrl(), resource);
} else {
throw new IllegalArgumentException(resource + " is not allowed here");
}
}
/*if (manifest != null) {
processDocumentManifest(manifest, submissionSet);
} else {*/
processDocumentManifest(manifestNeu, submissionSet);
// set limited metadata
for (CanonicalType profile : requestBundle.getMeta().getProfile()) {
if ("http://ihe.net/fhir/StructureDefinition/IHE_MHD_Provide_Comprehensive_DocumentBundle".equals(profile.getValue())) {
submissionSet.setLimitedMetadata(false);
} else if ("http://ihe.net/fhir/StructureDefinition/IHE_MHD_Provide_Minimal_DocumentBundle".equals(profile.getValue())) {
submissionSet.setLimitedMetadata(true);
} else if ("http://profiles.ihe.net/ITI/MHD/StructureDefinition/IHE.MHD.Comprehensive.ProvideBundle".equals(profile.getValue())) {
submissionSet.setLimitedMetadata(false);
} else if ("http://profiles.ihe.net/ITI/MHD/StructureDefinition/IHE.MHD.Minimal.ProvideBundle".equals(profile.getValue())) {
submissionSet.setLimitedMetadata(true);
}
}
// process all resources referenced in DocumentManifest.content
for (ListEntryComponent listEntry : manifestNeu.getEntry()) {
Reference content = listEntry.getItem();
String refTarget = content.getReference();
Resource resource = resources.get(refTarget);
if (resource instanceof DocumentReference) {
DocumentReference documentReference = (DocumentReference) resource;
Document doc = new Document();
DocumentEntry entry = new DocumentEntry();
processDocumentReference(documentReference, entry);
doc.setDocumentEntry(entry);
entry.setRepositoryUniqueId(config.getRepositoryUniqueId());
// create associations
for (DocumentReferenceRelatesToComponent relatesTo : documentReference.getRelatesTo()) {
Reference target = relatesTo.getTarget();
DocumentRelationshipType code = relatesTo.getCode();
Association association = new Association();
switch(code) {
case REPLACES:
association.setAssociationType(AssociationType.REPLACE);
break;
case TRANSFORMS:
association.setAssociationType(AssociationType.TRANSFORM);
break;
case SIGNS:
association.setAssociationType(AssociationType.SIGNS);
break;
case APPENDS:
association.setAssociationType(AssociationType.APPEND);
break;
default:
}
association.setSourceUuid(entry.getEntryUuid());
association.setTargetUuid(transformUriFromReference(target));
builder.withAssociation(association);
}
// get binary content from attachment.data or from referenced Binary resource
Attachment attachment = documentReference.getContentFirstRep().getAttachment();
if (attachment.hasData()) {
doc.setDataHandler(new DataHandler(new ByteArrayDataSource(attachment.getData(), attachment.getContentType())));
byte[] decoded = attachment.getData();
entry.setSize((long) decoded.length);
entry.setHash(SHAsum(decoded));
} else if (attachment.hasUrl()) {
String contentURL = attachment.getUrl();
Resource binaryContent = resources.get(contentURL);
if (binaryContent instanceof Binary) {
String contentType = attachment.getContentType();
Binary binary = (Binary) binaryContent;
if (binary.hasContentType() && !binary.getContentType().equals(contentType))
throw new InvalidRequestException("ContentType in Binary and in DocumentReference must match");
doc.setDataHandler(new DataHandler(new ByteArrayDataSource(binary.getData(), contentType)));
byte[] decoded = binary.getData();
entry.setSize((long) decoded.length);
entry.setHash(SHAsum(decoded));
Identifier masterIdentifier = documentReference.getMasterIdentifier();
binary.setUserData("masterIdentifier", noPrefix(masterIdentifier.getValue()));
}
}
builder.withDocument(doc);
}
}
return builder.build();
}
use of org.hl7.fhir.r4.model.DocumentReference in project MobileAccessGateway by i4mi.
the class Iti65ResponseConverter method translateToFhir.
/**
* convert ITI-41 response to ITI-65 response
*/
@Override
public Object translateToFhir(Response input, Map<String, Object> parameters) {
if (input.getStatus().equals(Status.SUCCESS)) {
Bundle responseBundle = new Bundle();
Bundle requestBundle = (Bundle) parameters.get(Utils.KEPT_BODY);
responseBundle.getMeta().addProfile("http://profiles.ihe.net/ITI/MHD/StructureDefinition/IHE.MHD.ProvideDocumentBundleResponse");
for (Bundle.BundleEntryComponent requestEntry : requestBundle.getEntry()) {
Bundle.BundleEntryResponseComponent response = new Bundle.BundleEntryResponseComponent().setStatus("201 Created").setLastModified(new Date());
if (requestEntry.getResource() instanceof Binary) {
String uniqueId = (String) requestEntry.getResource().getUserData("masterIdentifier");
response.setLocation(config.getUriMagXdsRetrieve() + "?uniqueId=" + uniqueId + "&repositoryUniqueId=" + config.getRepositoryUniqueId());
} else if (requestEntry.getResource() instanceof ListResource) {
String id = config.getSchemeMapper().getScheme(((ListResource) requestEntry.getResource()).getId());
response.setLocation("List/" + id);
} else if (requestEntry.getResource() instanceof DocumentReference) {
String id = config.getSchemeMapper().getScheme(((DocumentReference) requestEntry.getResource()).getId());
response.setLocation("DocumentReference/" + id);
}
responseBundle.addEntry().setResponse(response);
}
return responseBundle;
} else {
processError(input);
return null;
}
}
Aggregations