private static void checkNCreateRQ(Command rqCmd, Dataset rqData) throws DcmServiceException { shallBeEmpty(rqData, Tags.TransactionUID); notAllowed(rqData, Tags.SOPClassUID); notAllowed(rqData, Tags.SOPInstanceUID); type1(rqData, Tags.SPSPriority); type2(rqData, Tags.SPSModificationDateandTime); type1(rqData, Tags.ProcedureStepLabel); type2(rqData, Tags.WorklistLabel); type2(rqData, Tags.ScheduledProcessingParametersSeq); checkContentItem(rqData, Tags.ScheduledProcessingParametersSeq); type2(rqData, Tags.ScheduledStationNameCodeSeq); checkCodeItem(rqData, ItemCount.MULTIPLE, Tags.ScheduledStationNameCodeSeq); type2(rqData, Tags.ScheduledStationClassCodeSeq); checkCodeItem(rqData, ItemCount.MULTIPLE, Tags.ScheduledStationClassCodeSeq); type2(rqData, Tags.ScheduledStationGeographicLocationCodeSeq); checkCodeItem(rqData, ItemCount.MULTIPLE, Tags.ScheduledStationGeographicLocationCodeSeq); type2(rqData, Tags.ScheduledProcessingApplicationsCodeSeq); checkCodeItem(rqData, ItemCount.MULTIPLE, Tags.ScheduledProcessingApplicationsCodeSeq); checkScheduledHumanPerformers(rqData); type1(rqData, Tags.SPSStartDateAndTime); type2(rqData, Tags.ScheduledWorkitemCodeSeq); checkCodeItem(rqData, ItemCount.SINGLE, Tags.ScheduledWorkitemCodeSeq); type2(rqData, Tags.SPSComments); type2(rqData, Tags.InputInformationSeq); checkImageSOPInstanceAndSourceReference(rqData, Tags.InputInformationSeq); type2(rqData, Tags.AdmissionID); type2(rqData, Tags.IssuerOfAdmissionIDSeq); type2(rqData, Tags.AdmittingDiagnosisDescription); type2(rqData, Tags.AdmittingDiagnosisCodeSeq); checkCodeItem(rqData, ItemCount.MULTIPLE, Tags.AdmittingDiagnosisCodeSeq); type2(rqData, Tags.RefRequestSeq); checkReferencedRequests(rqData); type2(rqData, Tags.RelatedProcedureStepSeq); checkRelatedProcedureSteps(rqData); type1(rqData, Tags.UPSState); if (UPSScpService.upsStateAsInt(rqData.getString(Tags.UPSState)) != UPSState.SCHEDULED) throw new DcmServiceException( UPS_STATE_WAS_NOT_SCHEDULED, "The provided value of UPS State was not SCHEDULED"); shallBeEmpty(rqData, Tags.UPSProgressInformationSeq); shallBeEmpty(rqData, Tags.UPSPerformedProcedureSeq); }
@Override protected Dataset doNAction(ActiveAssociation assoc, Dimse rq, Command rspCmd) throws IOException, DcmServiceException { Association a = assoc.getAssociation(); String calledAET = a.getCalledAET(); String callingAET = a.getCallingAET(); String receivingAET; Command rqCmd = rq.getCommand(); Dataset rqData = rq.getDataset(); int actionTypeID = rqCmd.getInt(Tags.ActionTypeID, 0); rspCmd.putUS(Tags.ActionTypeID, actionTypeID); String iuid = rqCmd.getRequestedSOPInstanceUID(); String tuid; int state; boolean dellock; switch (actionTypeID) { case 1: if (abstractSyntaxEquals(assoc, rq, UIDs.UnifiedProcedureStepPullSOPClass)) { type1(rqData, Tags.UPSState); state = UPSScpService.upsStateAsInt(rqData.getString(Tags.UPSState)); if (state == UPSState.SCHEDULED) throw new DcmServiceException(MAY_ONLY_BECOME_SCHEDULED_VIA_NCREATE); tuid = rqData.getString(Tags.TransactionUID); if (tuid == null) throw new DcmServiceException(CORRECT_TRANSACTION_UID_NOT_PROVIDED); service.changeUPSState(calledAET, iuid, state, tuid); return rqData; } break; case 2: if (abstractSyntaxEquals( assoc, rq, UIDs.UnifiedProcedureStepPushSOPClass, UIDs.UnifiedProcedureStepWatchSOPClass)) { checkCodeItem(rqData, ItemCount.SINGLE, Tags.UPSDiscontinuationReasonCodeSeq); service.requestUPSCancel(calledAET, iuid, callingAET, rqData); return rqData; } break; case 3: if (abstractSyntaxEquals(assoc, rq, UIDs.UnifiedProcedureStepWatchSOPClass)) { type1(rqData, Tags.ReceivingAE); type1(rqData, Tags.DeletionLock); receivingAET = rqData.getString(Tags.ReceivingAE); dellock = deletionLockAsBoolean(rqData.getString(Tags.DeletionLock)); if (iuid.equals(UIDs.UnifiedWorklistandProcedureStepSOPInstance)) service.subscribeGlobally(calledAET, receivingAET, dellock); else service.subscribeReceiveUPSEventReports(calledAET, iuid, receivingAET, dellock); return rqData; } break; case 4: if (abstractSyntaxEquals(assoc, rq, UIDs.UnifiedProcedureStepWatchSOPClass)) { type1(rqData, Tags.ReceivingAE); receivingAET = rqData.getString(Tags.ReceivingAE); if (iuid.equals(UIDs.UnifiedWorklistandProcedureStepSOPInstance)) service.unsubscribeGlobally(receivingAET); else service.unsubscribeReceiveUPSEventReports(iuid, receivingAET); return rqData; } break; case 5: if (abstractSyntaxEquals(assoc, rq, UIDs.UnifiedProcedureStepWatchSOPClass) && iuid.equals(UIDs.UnifiedWorklistandProcedureStepSOPInstance)) { type1(rqData, Tags.ReceivingAE); receivingAET = rqData.getString(Tags.ReceivingAE); service.suspendGlobalSubscription(receivingAET); return rqData; } break; } throw new DcmServiceException(Status.NoSuchActionType).setActionTypeID(actionTypeID); }