Skip to content

Commit

Permalink
#258 : RESTful Service to Move/Copy Instances from one Study to anoth…
Browse files Browse the repository at this point in the history
…er Study
  • Loading branch information
vrindanayak committed Jul 15, 2016
1 parent 7858666 commit 34fb7e5
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -381,13 +381,14 @@ private StreamingOutput copyOrMoveInstances(String studyUID, InputStream in, Cod
ApplicationEntity ae = getApplicationEntity();
ArchiveAEExtension arcAE = ae.getAEExtension(ArchiveAEExtension.class);
ArchiveDeviceExtension arcDev = arcAE.getArchiveDeviceExtension();
if (!queryService.addSOPInstanceReferences(instanceRefs, ae))
throw new WebApplicationException(Response.Status.NOT_FOUND);

Map<String, String> uidMap = new HashMap<>();
StoreSession session = storeService.newStoreSession(request, ae);
Collection<InstanceLocations> instances = storeService.queryInstances(session, instanceRefs, studyUID, uidMap);

if (instances.isEmpty())
throw new WebApplicationException(Response.Status.NOT_FOUND);
Attributes sopInstanceRefs = getSOPInstanceRefs(instanceRefs, instances, ae, false);
moveSequence(sopInstanceRefs, Tag.ReferencedSeriesSequence, instanceRefs);
rejectInstanceRefs(code, instanceRefs, session, arcDev);
final Attributes result = storeService.copyInstances(session, instances, uidMap);

Expand All @@ -401,6 +402,43 @@ public void write(OutputStream out) throws IOException {
};
}

private Attributes getSOPInstanceRefs(Attributes instanceRefs, Collection<InstanceLocations> instances,
ApplicationEntity ae, boolean availability) {
String sourceStudyUID = instanceRefs.getString(Tag.StudyInstanceUID);
Attributes refStudy = new Attributes(2);
Sequence refSeriesSeq = refStudy.newSequence(Tag.ReferencedSeriesSequence, 10);
refStudy.setString(Tag.StudyInstanceUID, VR.UI, sourceStudyUID);
HashMap<String, Sequence> seriesMap = new HashMap<>();
for (InstanceLocations instance : instances) {
Attributes iAttr = instance.getAttributes();
String seriesIUID = iAttr.getString(Tag.SeriesInstanceUID);
Sequence refSOPSeq = seriesMap.get(seriesIUID);
if (refSOPSeq == null) {
Attributes refSeries = new Attributes(4);
refSeries.setString(Tag.RetrieveAETitle, VR.AE, ae.getAETitle());
refSOPSeq = refSeries.newSequence(Tag.ReferencedSOPSequence, 10);
refSeries.setString(Tag.SeriesInstanceUID, VR.UI, seriesIUID);
seriesMap.put(seriesIUID, refSOPSeq);
refSeriesSeq.add(refSeries);
}
Attributes refSOP = new Attributes(3);
if (availability)
refSOP.setString(Tag.InstanceAvailability, VR.CS, instance.getAvailability().toString());
refSOP.setString(Tag.ReferencedSOPClassUID, VR.UI, instance.getSopClassUID());
refSOP.setString(Tag.ReferencedSOPInstanceUID, VR.UI, instance.getSopInstanceUID());
refSOPSeq.add(refSOP);
}
return refStudy;
}

private void moveSequence(Attributes src, int tag, Attributes dest) {
Sequence srcSeq = src.getSequence(tag);
int size = srcSeq.size();
Sequence destSeq = dest.newSequence(tag, size);
for (int i = 0; i < size; i++)
destSeq.add(srcSeq.remove(0));
}

private void rejectInstanceRefs(Code code, Attributes instanceRefs, StoreSession session,
ArchiveDeviceExtension arcDev) throws IOException {
RejectionNote rjNote = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,4 @@ Attributes createRejectionNote(

Attributes createRejectionNote(Attributes sopInstanceRefs, RejectionNote rjNote);

boolean addSOPInstanceReferences(Attributes attrs, ApplicationEntity applicationEntity);

}
Original file line number Diff line number Diff line change
Expand Up @@ -211,42 +211,6 @@ public Attributes createRejectionNote(Attributes sopInstanceRefs, RejectionNote
return attrs;
}

@Override
public boolean addSOPInstanceReferences(Attributes attrs, ApplicationEntity ae) {
QueryParam queryParam = newQueryParam(ae, false, false, false, false, false);
String studyUID = attrs.getString(Tag.StudyInstanceUID);
Sequence seriesSeq = attrs.getSequence(Tag.ReferencedSeriesSequence);
if (seriesSeq == null) {
Attributes sopInstanceRefs = ejb.getSOPInstanceRefs(studyUID, null, null, queryParam, null, false);
if (sopInstanceRefs == null)
return false;

moveSequence(sopInstanceRefs, Tag.ReferencedSeriesSequence, attrs);
return true;
}
for (Attributes seriesRef : seriesSeq) {
String seriesUID = seriesRef.getString(Tag.SeriesInstanceUID);
Sequence sopSeq = seriesRef.getSequence(Tag.ReferencedSOPSequence);
if (sopSeq == null) {
Attributes sopInstanceRefs = ejb.getSOPInstanceRefs(studyUID, seriesUID, null, queryParam, null, false);
if (sopInstanceRefs == null)
return false;

moveSequence(sopInstanceRefs.getNestedDataset(Tag.ReferencedSeriesSequence), Tag.ReferencedSOPSequence,
seriesRef);
}
}
return true;
}

private void moveSequence(Attributes src, int tag, Attributes dest) {
Sequence srcSeq = src.getSequence(tag);
int size = srcSeq.size();
Sequence destSeq = dest.newSequence(tag, size);
for (int i = 0; i < size; i++)
destSeq.add(srcSeq.remove(0));
}

private void mkKOS(Attributes attrs, RejectionNote rjNote) {
Attributes studyRef = attrs.getNestedDataset(Tag.CurrentRequestedProcedureEvidenceSequence);
attrs.setString(Tag.SOPClassUID, VR.UI, UID.KeyObjectSelectionDocumentStorage);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import org.dcm4chee.arc.store.StoreSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Attr;

import javax.ejb.EJBException;
import javax.enterprise.context.ApplicationScoped;
Expand Down Expand Up @@ -251,16 +250,21 @@ public Collection<InstanceLocations> queryInstances(
uidMap.put(sourceStudyUID, targetStudyIUID);
Sequence refSeriesSeq = instanceRefs.getSequence(Tag.ReferencedSeriesSequence);
Map<String, Set<String>> refIUIDsBySeriesIUID = new HashMap<>();
for (Attributes item : refSeriesSeq) {
String seriesIUID = item.getString(Tag.SeriesInstanceUID);
uidMap.put(seriesIUID, UIDUtils.createUID());
refIUIDsBySeriesIUID.put(seriesIUID, refIUIDs(item.getSequence(Tag.ReferencedSOPSequence)));
RetrieveContext ctx;
if (refSeriesSeq == null) {
ctx = retrieveService.newRetrieveContextIOCM(session.getHttpRequest(), session.getCalledAET(),
sourceStudyUID);
} else {
for (Attributes item : refSeriesSeq) {
String seriesIUID = item.getString(Tag.SeriesInstanceUID);
uidMap.put(seriesIUID, UIDUtils.createUID());
refIUIDsBySeriesIUID.put(seriesIUID, refIUIDs(item.getSequence(Tag.ReferencedSOPSequence)));
}
ctx = retrieveService.newRetrieveContextIOCM(session.getHttpRequest(), session.getCalledAET(),
sourceStudyUID, refIUIDsBySeriesIUID.keySet().toArray(new String[refIUIDsBySeriesIUID.size()]));
}
RetrieveContext ctx = retrieveService.newRetrieveContextIOCM(session.getHttpRequest(), session.getCalledAET(),
sourceStudyUID, refIUIDsBySeriesIUID.keySet().toArray(new String[refIUIDsBySeriesIUID.size()]));
if (!retrieveService.calculateMatches(ctx))
return null;

Collection<InstanceLocations> matches = ctx.getMatches();
Iterator<InstanceLocations> matchesIter = matches.iterator();
while (matchesIter.hasNext()) {
Expand All @@ -282,7 +286,7 @@ private Set<String> refIUIDs(Sequence refSOPSeq) {

private boolean contains(Map<String, Set<String>> refIUIDsBySeriesIUID, InstanceLocations il) {
Set<String> iuids = refIUIDsBySeriesIUID.get(il.getAttributes().getString(Tag.SeriesInstanceUID));
return iuids != null && iuids.contains(il.getSopInstanceUID());
return iuids == null || iuids.contains(il.getSopInstanceUID());
}

private static void cleanup(StoreContext ctx) {
Expand Down

0 comments on commit 34fb7e5

Please sign in to comment.