From 7b1d823a946d2169a294b7bd52aca26081a1ec60 Mon Sep 17 00:00:00 2001 From: Gunter Zeilinger Date: Tue, 21 Feb 2017 10:28:52 +0100 Subject: [PATCH] Fix dcm4che/dcm4chee-arc-light#546: IHE RAD-69: Retrieve Imaging Document Set --- dcm4chee-arc-retrieve-xdsi/pom.xml | 6 ++ .../retrieve/xdsi/ImageDocumentSource.java | 76 +++++++++---------- .../retrieve/impl/RetrieveServiceImpl.java | 9 ++- 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/dcm4chee-arc-retrieve-xdsi/pom.xml b/dcm4chee-arc-retrieve-xdsi/pom.xml index e5d8db5d5..b020dfc3d 100644 --- a/dcm4chee-arc-retrieve-xdsi/pom.xml +++ b/dcm4chee-arc-retrieve-xdsi/pom.xml @@ -65,6 +65,12 @@ ${project.version} provided + + org.dcm4che.dcm4chee-arc + dcm4chee-arc-entity + ${project.version} + provided + org.dcm4che.dcm4chee-arc dcm4chee-arc-retrieve diff --git a/dcm4chee-arc-retrieve-xdsi/src/main/java/org/dcm4chee/arc/retrieve/xdsi/ImageDocumentSource.java b/dcm4chee-arc-retrieve-xdsi/src/main/java/org/dcm4chee/arc/retrieve/xdsi/ImageDocumentSource.java index d2f150e90..9ffdec18f 100644 --- a/dcm4chee-arc-retrieve-xdsi/src/main/java/org/dcm4chee/arc/retrieve/xdsi/ImageDocumentSource.java +++ b/dcm4chee-arc-retrieve-xdsi/src/main/java/org/dcm4chee/arc/retrieve/xdsi/ImageDocumentSource.java @@ -40,10 +40,12 @@ package org.dcm4chee.arc.retrieve.xdsi; +import org.dcm4che3.data.UID; import org.dcm4che3.net.Device; import org.dcm4che3.net.service.DicomServiceException; import org.dcm4che3.ws.rs.MediaTypes; import org.dcm4chee.arc.conf.ArchiveDeviceExtension; +import org.dcm4chee.arc.entity.Location; import org.dcm4chee.arc.retrieve.*; import javax.activation.DataHandler; @@ -52,7 +54,6 @@ import javax.jws.WebService; import javax.servlet.http.HttpServletRequest; import javax.xml.ws.BindingType; -import javax.xml.ws.WebServiceContext; import javax.xml.ws.soap.Addressing; import javax.xml.ws.soap.MTOM; import javax.xml.ws.soap.SOAPBinding; @@ -81,7 +82,7 @@ public class ImageDocumentSource implements ImagingDocumentSourcePortType { public static final String XDS_ERR_MISSING_DOCUMENT = "XDSMissingDocument"; public static final String XDS_ERR_DOCUMENT_SOURCE_ERROR = "XDSDocumentSourceError"; public static final String DICOM_OBJECT_NOT_FOUND = "DICOM Object not found"; - public static final String MISSING_TRANSFER_SYNTAX_UIDLIST = "Missing TransferSyntaxUIDList"; + public static final String NO_ACCEPTABLE_TRANSFER_SYNTAX = "DICOM Object not acceptable according provided TransferSyntaxUIDList"; @Inject private RetrieveService retrieveService; @@ -92,8 +93,6 @@ public class ImageDocumentSource implements ImagingDocumentSourcePortType { @Inject private HttpServletRequest request; - private WebServiceContext wsctx; - @Inject @RetrieveStart private Event retrieveStart; @@ -107,29 +106,19 @@ public RetrieveDocumentSetResponseType imagingDocumentSourceRetrieveImagingDocum RegistryResponseType regRsp = new RegistryResponseType(); rsp.setRegistryResponse(regRsp); DocumentRequests docReqs = new DocumentRequests(req.getStudyRequest()); + RetrieveContext ctx = retrieveService.newRetrieveContextXDSI(request, getLocalAET(), + docReqs.studyUIDs, docReqs.seriesUIDs, docReqs.objectUIDs); List tsuids = req.getTransferSyntaxUIDList().getTransferSyntaxUID(); - if (!validateTransferSyntaxes(tsuids)) { - addRegisterErrors(regRsp, docReqs, XDS_ERR_DOCUMENT_SOURCE_ERROR, MISSING_TRANSFER_SYNTAX_UIDLIST); - } else { - RetrieveContext ctx = retrieveService.newRetrieveContextXDSI(request, getLocalAET(), - docReqs.studyUIDs, docReqs.seriesUIDs, docReqs.objectUIDs); - try { - retrieveService.calculateMatches(ctx); - if (validateMatches(ctx, docReqs, regRsp)) { - retrieveStart.fire(ctx); - int n = ctx.getNumberOfMatches(); - for (InstanceLocations match : ctx.getMatches()) { - DicomDataHandler dh = new DicomDataHandler(ctx, match, tsuids); - rsp.getDocumentResponse().add( - createDocumentResponse(docReqs.get(match.getSopInstanceUID()), - dh)); - if (--n == 0) - dh.setRetrieveEnd(retrieveEnd); - } - } - } catch (DicomServiceException e) { - addRegisterErrors(regRsp, docReqs, XDS_ERR_DOCUMENT_SOURCE_ERROR, e.getMessage()); + if (calculateMatches(ctx, docReqs, regRsp, tsuids)) { + retrieveStart.fire(ctx); + DicomDataHandler dh = null; + for (InstanceLocations match : ctx.getMatches()) { + dh = new DicomDataHandler(ctx, match, tsuids); + rsp.getDocumentResponse().add( + createDocumentResponse(docReqs.get(match.getSopInstanceUID()), dh)); } + if (dh != null) + dh.setRetrieveEnd(retrieveEnd); } regRsp.setStatus(regRsp.getRegistryErrorList() == null ? XDS_B_STATUS_SUCCESS : rsp.getDocumentResponse().isEmpty() ? XDS_B_STATUS_FAILURE @@ -137,17 +126,6 @@ public RetrieveDocumentSetResponseType imagingDocumentSourceRetrieveImagingDocum return rsp; } - private boolean validateTransferSyntaxes(List tsuids) { - if (tsuids.isEmpty()) - return false; - - for (String tsuid : tsuids) { - if (tsuid.isEmpty()) - return false; - } - return true; - } - private void addRegisterErrors( RegistryResponseType regRsp, DocumentRequests docReqs, String errorCode, String codeContext) { List errors = errors(regRsp); @@ -156,12 +134,20 @@ private void addRegisterErrors( } } - private boolean validateMatches(RetrieveContext ctx, DocumentRequests docReqs, RegistryResponseType regRsp) { + private boolean calculateMatches( + RetrieveContext ctx, DocumentRequests docReqs, RegistryResponseType regRsp, List tsuids) { + try { + retrieveService.calculateMatches(ctx); + } catch (DicomServiceException e) { + addRegisterErrors(regRsp, docReqs, XDS_ERR_DOCUMENT_SOURCE_ERROR, e.getMessage()); + return false; + } List matches = ctx.getMatches(); HashSet iuids = new HashSet<>(docReqs.keySet()); Iterator iter = matches.iterator(); while (iter.hasNext()) { - if (!iuids.remove(iter.next().getSopInstanceUID())) + InstanceLocations match = iter.next(); + if (!iuids.remove(match.getSopInstanceUID()) || !validateTransferSyntax(match, regRsp, tsuids)) iter.remove(); } for (String iuid : iuids) { @@ -173,6 +159,20 @@ private boolean validateMatches(RetrieveContext ctx, DocumentRequests docReqs, R return !matches.isEmpty(); } + private boolean validateTransferSyntax(InstanceLocations match, RegistryResponseType regRsp, List tsuids) { + for (Location location : match.getLocations()) { + if (tsuids.contains(location.getTransferSyntaxUID())) + return true; + } + if (tsuids.contains(UID.ExplicitVRLittleEndian) || tsuids.contains(UID.ImplicitVRLittleEndian)) + return true; + + errors(regRsp).add(createRegistryError( + XDS_ERR_MISSING_DOCUMENT, NO_ACCEPTABLE_TRANSFER_SYNTAX, XDS_ERR_SEVERITY_ERROR, + match.getSopInstanceUID())); + return false; + } + private RegistryError createRegistryError( String errorCode, String codeContext, String severity, String location) { RegistryError error = new RegistryError(); diff --git a/dcm4chee-arc-retrieve/src/main/java/org/dcm4chee/arc/retrieve/impl/RetrieveServiceImpl.java b/dcm4chee-arc-retrieve/src/main/java/org/dcm4chee/arc/retrieve/impl/RetrieveServiceImpl.java index 817eb5d0f..1f4ada4e4 100644 --- a/dcm4chee-arc-retrieve/src/main/java/org/dcm4chee/arc/retrieve/impl/RetrieveServiceImpl.java +++ b/dcm4chee-arc-retrieve/src/main/java/org/dcm4chee/arc/retrieve/impl/RetrieveServiceImpl.java @@ -664,9 +664,12 @@ public Transcoder openTranscoder(RetrieveContext ctx, InstanceLocations inst, LocationDicomInputStream locationInputStream = openLocationInputStream(ctx, inst); String tsuid = locationInputStream.getLocation().getTransferSyntaxUID(); if (!tsuids.isEmpty() && !tsuids.contains(tsuid)) { - tsuid = fmi || tsuids.contains(UID.ExplicitVRLittleEndian) - ? UID.ExplicitVRLittleEndian - : UID.ImplicitVRLittleEndian; + if (tsuids.contains(UID.ExplicitVRLittleEndian)) + tsuid = UID.ExplicitVRLittleEndian; + else if (tsuids.contains(UID.ImplicitVRLittleEndian)) + tsuid = UID.ExplicitVRLittleEndian; + else + throw new NoPresentationContextException(inst.getSopClassUID(), tsuid); } Transcoder transcoder = new Transcoder(locationInputStream.getDicomInputStream()); transcoder.setIncludeBulkData(DicomInputStream.IncludeBulkData.URI);