private void coerceNCreateRQ(Command rspCmd, Dataset rqData) { rqData.putUI(Tags.SOPClassUID, rspCmd.getAffectedSOPClassUID()); rqData.putUI(Tags.SOPInstanceUID, rspCmd.getAffectedSOPInstanceUID()); initSPSModificationDateandTime(rqData); if (!rqData.containsValue(Tags.WorklistLabel)) rqData.putLO(Tags.WorklistLabel, service.getWorklistLabel()); }
/** * Prepares the Dataset representing the search key in C-FIND. As no values are set, the keys * match to every content in the archive. The user has to specify concret values to limit the * searchSee PS 3.4 - C.6.2.1.2 Study level. * * <p>As the result for C-FIND these keys are filled with the values found in the archive. * * @param cfg the configuration properties for this class. * @throws ParseException if a given properties for the keys was not found. */ private void initKeys(ConfigProperties cfg) throws ParseException { // Remove all keys keys = dof.newDataset(); // Query/Retrieve Level. PS 3.4 - C.6.2 Study Root SOP Class Group keys.putCS(Tags.QueryRetrieveLevel, getQueryRetrieveLevel(STUDY_LEVEL)); // UNIQUE STUDY LEVEL KEY FOR THE STUDY. See PS 3.4 - C.6.2.1.2 Study level keys.putUI(Tags.StudyInstanceUID); // REQUIRED STUDY LEVEL KEY FOR THE STUDY. See PS 3.4 - C.6.2.1.2 Study level keys.putDA(Tags.StudyDate); // Not defined: StudyTime // Not defined: AccessionNumber keys.putPN(Tags.PatientName); keys.putLO(Tags.PatientID); // Not defined: StudyID // OPTIONAL STUDY LEVEL KEY FOR THE STUDY. See PS 3.4 - C.6.2.1.2 Study level keys.putUS(Tags.NumberOfStudyRelatedSeries); keys.putUS(Tags.NumberOfStudyRelatedInstances); // mutch more defined... // Add the keys found in the configuration properties addQueryKeys(cfg); }
public void addWorklistItem( Long studyPk, String templateFile, String humanPerformerCode, Long scheduleDate) throws Exception { String uri = FileUtils.resolve(new File(templatePath, templateFile + ".xml")).toURI().toString(); if (log.isDebugEnabled()) log.debug("load template file: " + uri); Dataset ds = DatasetUtils.fromXML(new InputSource(uri)); ContentManager cm = getContentManager(); // patient Dataset patDS = cm.getPatientForStudy(studyPk.longValue()); if (log.isDebugEnabled()) { log.debug("Patient Dataset:"); log.debug(patDS); } ds.putAll(patDS.subSet(PAT_ATTR_TAGS)); // Dataset sopInstRef = cm.getSOPInstanceRefMacro(studyPk.longValue(), false); String studyIUID = sopInstRef.getString(Tags.StudyInstanceUID); ds.putUI(Tags.SOPInstanceUID, UIDGenerator.getInstance().createUID()); ds.putUI(Tags.StudyInstanceUID, studyIUID); DcmElement inSq = ds.putSQ(Tags.InputInformationSeq); inSq.addItem(sopInstRef); // Scheduled Human Performer Seq DcmElement schedHPSq = ds.putSQ(Tags.ScheduledHumanPerformersSeq); Dataset item = schedHPSq.addNewItem(); DcmElement hpCodeSq = item.putSQ(Tags.HumanPerformerCodeSeq); Dataset dsCode = (Dataset) this.humanPerformer.get(humanPerformerCode); log.info(dsCode); if (dsCode != null) { hpCodeSq.addItem(dsCode); item.putPN(Tags.HumanPerformerName, dsCode.getString(Tags.CodeMeaning)); } // Scheduled Procedure Step Start Date and Time ds.putDT(Tags.SPSStartDateAndTime, new Date(scheduleDate.longValue())); if (log.isDebugEnabled()) { log.debug("GPSPS Dataset:"); log.debug(ds); } addWorklistItem(ds); }
private Dataset getStudyMgtDataset(StudyLocal study, Map mapSeries) { Dataset ds = dof.newDataset(); ds.putUI(Tags.StudyInstanceUID, study.getStudyIuid()); ds.putOB(PrivateTags.StudyPk, Convert.toBytes(study.getPk().longValue())); ds.putSH(Tags.AccessionNumber, study.getAccessionNumber()); ds.putLO(Tags.PatientID, study.getPatient().getPatientId()); ds.putLO(Tags.IssuerOfPatientID, study.getPatient().getIssuerOfPatientId()); ds.putPN(Tags.PatientName, study.getPatient().getPatientName()); log.debug("getStudyMgtDataset: studyIUID:" + study.getStudyIuid()); DcmElement refSeriesSeq = ds.putSQ(Tags.RefSeriesSeq); Iterator iter = (mapSeries == null) ? study.getSeries().iterator() : mapSeries.keySet().iterator(); while (iter.hasNext()) { SeriesLocal sl = (SeriesLocal) iter.next(); Dataset dsSer = refSeriesSeq.addNewItem(); dsSer.putUI(Tags.SeriesInstanceUID, sl.getSeriesIuid()); Collection instances = (mapSeries == null) ? sl.getInstances() : (Collection) mapSeries.get(sl); Iterator iter2 = instances.iterator(); DcmElement refSopSeq = null; if (iter2.hasNext()) refSopSeq = dsSer.putSQ(Tags.RefSOPSeq); while (iter2.hasNext()) { InstanceLocal il = (InstanceLocal) iter2.next(); Dataset dsInst = refSopSeq.addNewItem(); dsInst.putUI(Tags.RefSOPClassUID, il.getSopCuid()); dsInst.putUI(Tags.RefSOPInstanceUID, il.getSopIuid()); dsInst.putAE(Tags.RetrieveAET, il.getRetrieveAETs()); } } if (log.isDebugEnabled()) { log.debug("return StgMgtDataset:"); log.debug(ds); } return ds; }
public void handleNotification(Notification notif, Object handback) { String spsuid = (String) notif.getUserData(); Dataset pps = DcmObjectFactory.getInstance().newDataset(); try { Dataset sps; GPWLManager gpwlmgr = getGPWLManager(); sps = gpwlmgr.getWorklistItem(spsuid); String ppsiuid = spsuid + ppsuidSuffix; String status = sps.getString(Tags.GPSPSStatus); pps.putCS(Tags.GPPPSStatus, status); pps.putUI(Tags.SOPInstanceUID, ppsiuid); Date now = new Date(); if ("IN PROGRESS".equals(status)) { try { getGPPPSManager().getGPPPS(ppsiuid); return; // avoid duplicate N_CREATE } catch (Exception e) { } pps.putSH(Tags.PPSID, "PPS" + ppsiuid.hashCode()); pps.putDA(Tags.PPSStartDate, now); pps.putTM(Tags.PPSStartTime, now); pps.putDA(Tags.PPSEndDate); pps.putTM(Tags.PPSEndTime); for (int i = 0; i < N_CREATE_TYPE2_ATTRS.length; i++) { pps.putXX(N_CREATE_TYPE2_ATTRS[i]); } pps.putAll(sps.subSet(N_CREATE_SPS_ATTRS)); copyCode( copyWorkitemCode, sps.getItem(Tags.ScheduledWorkitemCodeSeq), pps.putSQ(Tags.PerformedWorkitemCodeSeq)); copyCode( copyStationNameCode, sps.getItem(Tags.ScheduledStationNameCodeSeq), pps.putSQ(Tags.PerformedStationNameCodeSeq)); copyCode( copyStationClassCode, sps.getItem(Tags.ScheduledStationClassCodeSeq), pps.putSQ(Tags.PerformedStationClassCodeSeq)); copyCode( copyStationGeographicLocationCode, sps.getItem(Tags.ScheduledStationGeographicLocationCodeSeq), pps.putSQ(Tags.PerformedStationGeographicLocationCodeSeq)); copyCode( copyProcessingApplicationsCode, sps.getItem(Tags.ScheduledProcessingApplicationsCodeSeq), pps.putSQ(Tags.PerformedProcessingApplicationsCodeSeq)); } else if ("COMPLETED".equals(status) || "DISCONTINUED".equals(status)) { pps.putDA(Tags.PPSEndDate, now); pps.putTM(Tags.PPSEndTime, now); pps.putAll(gpwlmgr.getOutputInformation(spsuid)); } else { return; } } catch (Exception e) { log.error("Failed to access GP-SPS[" + spsuid + "]", e); return; } for (int i = 0; i < destAETs.length; i++) { PPSOrder order = new PPSOrder(pps, destAETs[i]); try { log.info("Scheduling " + order); jmsDelegate.queue(queueName, order, Message.DEFAULT_PRIORITY, 0L); } catch (Exception e) { log.error("Failed to schedule " + order, e); } } }
public Vector cGET(Dataset ds) throws ConnectException, IOException, InterruptedException { PresContext pc; List dimseList; Vector datasetVector; // An association must be active if (aassoc == null) { throw new ConnectException("No Association established"); } // Test, if Presentation Context for C-MOVE is supported // API doc: Association.getAcceptedPresContext(String asuid, String tsuid) if ((pc = aassoc .getAssociation() .getAcceptedPresContext( UIDs.StudyRootQueryRetrieveInformationModelGET, UIDs.ExplicitVRLittleEndian)) == null && (pc = aassoc .getAssociation() .getAcceptedPresContext( UIDs.StudyRootQueryRetrieveInformationModelGET, UIDs.ImplicitVRLittleEndian)) == null) { throw new ConnectException( "Association does not support presentation context for StudyRootQueryRetrieveInformationModelMOVE SOP."); } // Get the Study Instance UID of the study to mode String suid = ds.getString(Tags.SOPInstanceUID); // Prepare info for logging String patName = ds.getString(Tags.PatientName); String patID = ds.getString(Tags.PatientID); String studyDate = ds.getString(Tags.StudyDate); String prompt = "Study[" + suid + "] from " + studyDate + " for Patient[" + patID + "]: " + patName; // log.info("Moving: " + prompt); // New Cammand Set, see: DICOM Part 7: Message Exchange, 6.3.1 Command Set Structure Command rqCmd = dof.newCommand(); // API doc: Command.initCMoveRQ(int msgID, String sopClassUID, int priority, String moveDest) rqCmd.initCGetRSP(assoc.nextMsgID(), UIDs.StudyRootQueryRetrieveInformationModelGET, priority); Dataset rqDs = dof.newDataset(); rqDs.putCS(Tags.QueryRetrieveLevel, getQueryRetrieveLevel(STUDY_LEVEL)); // Only Unique Key allowed in C-MOVE. PS 3.4 -C.2.2.1 Attribute Types rqDs.putUI(Tags.SOPInstanceUID, suid); // API doc: AssociationFactorynewDimse(int pcid, Command cmd, Dataset ds) // DIMSE (DICOM Message Service Element) ist ein Nachrichtendienst in DICOM Dimse moveRq = aFact.newDimse(pc.pcid(), rqCmd, rqDs); // Invoke active association with move request Dimse FutureRSP future = aassoc.invoke(moveRq); // Response to the C-MOVE request. // The result cannot be accessed until it has been set. Dimse moveRsp = future.get(); Command rspCmd = moveRsp.getCommand(); if (DEBUG) { StringWriter w = new StringWriter(); w.write("C-FIND RQ Identifier:\n"); keys.dumpDataset(w, null); log.debug(w.toString()); } // Invoke active association with find request Dimse // Response to the C-FIND request. // The result cannot be accessed until it has been set. // Get the list of found objects dimseList = future.listPending(); // >>>> Extract Dataset from Dimse datasetVector = new Vector(); // If no List of DIMSE objects was generated or it is empty return an empty Vector if (dimseList == null || dimseList.isEmpty()) { return datasetVector; } // Process all elements for (int i = 0; i < dimseList.size(); i++) { datasetVector.addElement(((Dimse) dimseList.get(i)).getDataset()); if (((Dimse) dimseList.get(i)).getDataset() == null) System.out.println(" Dataset created succesffullyu "); } // PS 3.7 - 9.3.4 C-MOVE PROTOCOL, 9.3.4.2 C-MOVE-RSP int status = rspCmd.getStatus(); switch (status) { case 0x0000: // log.info("Moved: " + prompt); break; case 0xB000: log.error("One or more failures during move of " + prompt); break; default: log.error("Failed to move " + prompt + "\n\terror tstatus: " + Integer.toHexString(status)); break; } System.out.println("The move sise is : " + datasetVector.size()); return datasetVector; }