/// <summary> /// Method for processing Image level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { List <uint> tagList = new List <uint>(); List <uint> matchingTagList = new List <uint>(); DicomAttributeCollection data = message; string studyInstanceUid = data[DicomTags.StudyInstanceUid].GetString(0, String.Empty); string seriesInstanceUid = data[DicomTags.SeriesInstanceUid].GetString(0, String.Empty); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. LoadStudyPartition(studyInstanceUid); StudyStorageLocation location; FilesystemMonitor.Instance.GetReadableStudyStorageLocation(Partition.Key, studyInstanceUid, StudyRestore.True, StudyCache.True, out location); // Will always return a value, although it may be an empty StudyXml file StudyXml studyXml = location.LoadStudyXml(); SeriesXml seriesXml = studyXml[seriesInstanceUid]; if (seriesXml == null) { throw new DicomException("Unable to find series"); } foreach (DicomAttribute attrib in message) { if (attrib.Tag.TagValue == DicomTags.QueryRetrieveLevel) { continue; } tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) { matchingTagList.Add(attrib.Tag.TagValue); } } foreach (InstanceXml theInstanceStream in seriesXml) { if (CompareInstanceMatch(message, matchingTagList, theInstanceStream)) { DicomMessage response = new DicomMessage(); PopulateInstance(message, response, tagList, theInstanceStream); del(response.DataSet); } } return; }
/// <summary> /// Method for processing Series level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { //Read context for the query. using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var tagList = new List <uint>(); var selectSeries = read.GetBroker <ISeriesEntityBroker>(); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. var criteria = new SeriesSelectCriteria(); if (Partition != null) { criteria.ServerPartitionKey.EqualTo(Partition.Key); } DicomAttributeCollection data = message; foreach (DicomAttribute attrib in message) { tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) { switch (attrib.Tag.TagValue) { case DicomTags.StudyInstanceUid: List <ServerEntityKey> list = LoadStudyKey(read, (string[])data[DicomTags.StudyInstanceUid].Values); QueryHelper.SetKeyCondition(criteria.StudyKey, list.ToArray()); break; case DicomTags.SeriesInstanceUid: QueryHelper.SetStringArrayCondition(criteria.SeriesInstanceUid, (string[])data[DicomTags.SeriesInstanceUid].Values); break; case DicomTags.Modality: QueryHelper.SetStringCondition(criteria.Modality, data[DicomTags.Modality].GetString(0, string.Empty)); break; case DicomTags.SeriesNumber: QueryHelper.SetStringCondition(criteria.SeriesNumber, data[DicomTags.SeriesNumber].GetString(0, string.Empty)); break; case DicomTags.SeriesDescription: QueryHelper.SetStringCondition(criteria.SeriesDescription, data[DicomTags.SeriesDescription].GetString(0, string.Empty)); break; case DicomTags.PerformedProcedureStepStartDate: QueryHelper.SetRangeCondition(criteria.PerformedProcedureStepStartDate, data[DicomTags.PerformedProcedureStepStartDate].GetString(0, string.Empty)); break; case DicomTags.PerformedProcedureStepStartTime: QueryHelper.SetRangeCondition(criteria.PerformedProcedureStepStartTime, data[DicomTags.PerformedProcedureStepStartTime].GetString(0, string.Empty)); break; case DicomTags.RequestAttributesSequence: // todo break; } } } // Open a second read context, in case other queries are required. using (IReadContext subRead = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { selectSeries.Find(criteria, delegate(Series row) { if (CancelReceived) { throw new DicomException("DICOM C-Cancel Received"); } var response = new DicomMessage(); PopulateSeries(subRead, message, response, tagList, row); del(response.DataSet); }); } return; } }
public abstract void Query(DicomAttributeCollection query, ServerQueryResultDelegate del);
/// <summary> /// Method for processing Study level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { var tagList = new List <uint>(); using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var find = read.GetBroker <IStudyEntityBroker>(); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. var criteria = new StudySelectCriteria(); if (Partition != null) { criteria.ServerPartitionKey.EqualTo(Partition.Key); } if (!Thread.CurrentPrincipal.IsInRole(Macro.Enterprise.Common.AuthorityTokens.DataAccess.AllStudies)) { var principal = Thread.CurrentPrincipal as CustomPrincipal; if (principal != null) { var oidList = new List <ServerEntityKey>(); foreach (var oid in principal.Credentials.DataAccessAuthorityGroups) { oidList.Add(new ServerEntityKey("OID", oid)); } var dataAccessGroupSelectCriteria = new DataAccessGroupSelectCriteria(); dataAccessGroupSelectCriteria.AuthorityGroupOID.In(oidList); IList <DataAccessGroup> groups; using (IReadContext context = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var broker = context.GetBroker <IDataAccessGroupEntityBroker>(); groups = broker.Find(dataAccessGroupSelectCriteria); } var entityList = new List <ServerEntityKey>(); foreach (DataAccessGroup group in groups) { entityList.Add(group.Key); } var dataAccessSelectCriteria = new StudyDataAccessSelectCriteria(); dataAccessSelectCriteria.DataAccessGroupKey.In(entityList); criteria.StudyDataAccessRelatedEntityCondition.Exists(dataAccessSelectCriteria); } } DicomAttributeCollection data = message; foreach (DicomAttribute attrib in message) { tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) { switch (attrib.Tag.TagValue) { case DicomTags.StudyInstanceUid: QueryHelper.SetStringArrayCondition(criteria.StudyInstanceUid, (string[])data[DicomTags.StudyInstanceUid].Values); break; case DicomTags.PatientsName: QueryHelper.SetStringCondition(criteria.PatientsName, data[DicomTags.PatientsName].GetString(0, string.Empty)); break; case DicomTags.PatientId: QueryHelper.SetStringCondition(criteria.PatientId, data[DicomTags.PatientId].GetString(0, string.Empty)); break; case DicomTags.PatientsBirthDate: QueryHelper.SetRangeCondition(criteria.PatientsBirthDate, data[DicomTags.PatientsBirthDate].GetString(0, string.Empty)); break; case DicomTags.PatientsSex: QueryHelper.SetStringCondition(criteria.PatientsSex, data[DicomTags.PatientsSex].GetString(0, string.Empty)); break; case DicomTags.StudyDate: QueryHelper.SetRangeCondition(criteria.StudyDate, data[DicomTags.StudyDate].GetString(0, string.Empty)); break; case DicomTags.StudyTime: QueryHelper.SetRangeCondition(criteria.StudyTime, data[DicomTags.StudyTime].GetString(0, string.Empty)); break; case DicomTags.AccessionNumber: QueryHelper.SetStringCondition(criteria.AccessionNumber, data[DicomTags.AccessionNumber].GetString(0, string.Empty)); break; case DicomTags.StudyId: QueryHelper.SetStringCondition(criteria.StudyId, data[DicomTags.StudyId].GetString(0, string.Empty)); break; case DicomTags.StudyDescription: QueryHelper.SetStringCondition(criteria.StudyDescription, data[DicomTags.StudyDescription].GetString(0, string.Empty)); break; case DicomTags.ReferringPhysiciansName: QueryHelper.SetStringCondition(criteria.ReferringPhysiciansName, data[DicomTags.ReferringPhysiciansName].GetString(0, string.Empty)); break; case DicomTags.ModalitiesInStudy: // Specify a subselect on Modality in series var seriesSelect = new SeriesSelectCriteria(); QueryHelper.SetStringArrayCondition(seriesSelect.Modality, (string[])data[DicomTags.ModalitiesInStudy].Values); criteria.SeriesRelatedEntityCondition.Exists(seriesSelect); break; } } } // Open another read context, in case additional queries are required. using (IReadContext subRead = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { // First find the Online studies var storageCriteria = new StudyStorageSelectCriteria(); storageCriteria.StudyStatusEnum.NotEqualTo(StudyStatusEnum.Nearline); storageCriteria.QueueStudyStateEnum.NotIn(new[] { QueueStudyStateEnum.DeleteScheduled, QueueStudyStateEnum.WebDeleteScheduled, QueueStudyStateEnum.EditScheduled }); criteria.StudyStorageRelatedEntityCondition.Exists(storageCriteria); find.Find(criteria, delegate(Study row) { var response = new DicomMessage(); //TODO (CR May 2010): should the availability be NEARLINE? The criteria above was for ONLINE studies. PopulateStudy(subRead, response, tagList, row, "NEARLINE"); del(response.DataSet); }); // Now find the Nearline studies storageCriteria = new StudyStorageSelectCriteria(); storageCriteria.StudyStatusEnum.EqualTo(StudyStatusEnum.Nearline); storageCriteria.QueueStudyStateEnum.NotIn(new[] { QueueStudyStateEnum.DeleteScheduled, QueueStudyStateEnum.WebDeleteScheduled, QueueStudyStateEnum.EditScheduled }); criteria.StudyStorageRelatedEntityCondition.Exists(storageCriteria); find.Find(criteria, delegate(Study row) { var response = new DicomMessage(); PopulateStudy(subRead, response, tagList, row, "NEARLINE"); del(response.DataSet); }); } } return; }
/// <summary> /// Method for processing Image level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { List<uint> tagList = new List<uint>(); List<uint> matchingTagList = new List<uint>(); DicomAttributeCollection data = message; string studyInstanceUid = data[DicomTags.StudyInstanceUid].GetString(0, String.Empty); string seriesInstanceUid = data[DicomTags.SeriesInstanceUid].GetString(0, String.Empty); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. LoadStudyPartition(studyInstanceUid); StudyStorageLocation location; FilesystemMonitor.Instance.GetReadableStudyStorageLocation(Partition.Key, studyInstanceUid, StudyRestore.True, StudyCache.True, out location); // Will always return a value, although it may be an empty StudyXml file StudyXml studyXml = location.LoadStudyXml(); SeriesXml seriesXml = studyXml[seriesInstanceUid]; if (seriesXml == null) { throw new DicomException("Unable to find series"); } foreach (DicomAttribute attrib in message) { if (attrib.Tag.TagValue == DicomTags.QueryRetrieveLevel) continue; tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) matchingTagList.Add(attrib.Tag.TagValue); } foreach (InstanceXml theInstanceStream in seriesXml) { if (CompareInstanceMatch(message, matchingTagList, theInstanceStream)) { DicomMessage response = new DicomMessage(); PopulateInstance(message, response, tagList, theInstanceStream); del(response.DataSet); } } return; }
/// <summary> /// Method for processing Series level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { //Read context for the query. using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var tagList = new List<uint>(); var selectSeries = read.GetBroker<ISeriesEntityBroker>(); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. var criteria = new SeriesSelectCriteria(); if (Partition!=null) criteria.ServerPartitionKey.EqualTo(Partition.Key); DicomAttributeCollection data = message; foreach (DicomAttribute attrib in message) { tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) switch (attrib.Tag.TagValue) { case DicomTags.StudyInstanceUid: List<ServerEntityKey> list = LoadStudyKey(read, (string[])data[DicomTags.StudyInstanceUid].Values); QueryHelper.SetKeyCondition(criteria.StudyKey, list.ToArray()); break; case DicomTags.SeriesInstanceUid: QueryHelper.SetStringArrayCondition(criteria.SeriesInstanceUid, (string[])data[DicomTags.SeriesInstanceUid].Values); break; case DicomTags.Modality: QueryHelper.SetStringCondition(criteria.Modality, data[DicomTags.Modality].GetString(0, string.Empty)); break; case DicomTags.SeriesNumber: QueryHelper.SetStringCondition(criteria.SeriesNumber, data[DicomTags.SeriesNumber].GetString(0, string.Empty)); break; case DicomTags.SeriesDescription: QueryHelper.SetStringCondition(criteria.SeriesDescription, data[DicomTags.SeriesDescription].GetString(0, string.Empty)); break; case DicomTags.PerformedProcedureStepStartDate: QueryHelper.SetRangeCondition(criteria.PerformedProcedureStepStartDate, data[DicomTags.PerformedProcedureStepStartDate].GetString(0, string.Empty)); break; case DicomTags.PerformedProcedureStepStartTime: QueryHelper.SetRangeCondition(criteria.PerformedProcedureStepStartTime, data[DicomTags.PerformedProcedureStepStartTime].GetString(0, string.Empty)); break; case DicomTags.RequestAttributesSequence: // todo break; } } // Open a second read context, in case other queries are required. using (IReadContext subRead = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { selectSeries.Find(criteria, delegate(Series row) { if (CancelReceived) throw new DicomException("DICOM C-Cancel Received"); var response = new DicomMessage(); PopulateSeries(subRead, message, response, tagList, row); del(response.DataSet); }); } return; } }
/// <summary> /// Method for processing Study level queries. /// </summary> /// <param name="message"></param> /// <param name="del"></param> /// <returns></returns> public override void Query(DicomAttributeCollection message, ServerQueryResultDelegate del) { var tagList = new List<uint>(); using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var find = read.GetBroker<IStudyEntityBroker>(); //TODO (CR May 2010): Should change so that the Partition AE Title is passed in the RetrieveAeTitle tag in the query message. var criteria = new StudySelectCriteria(); if (Partition !=null) criteria.ServerPartitionKey.EqualTo(Partition.Key); if (!Thread.CurrentPrincipal.IsInRole(ClearCanvas.Enterprise.Common.AuthorityTokens.DataAccess.AllStudies)) { var principal = Thread.CurrentPrincipal as CustomPrincipal; if (principal != null) { var oidList = new List<ServerEntityKey>(); foreach (var oid in principal.Credentials.DataAccessAuthorityGroups) oidList.Add(new ServerEntityKey("OID", oid)); var dataAccessGroupSelectCriteria = new DataAccessGroupSelectCriteria(); dataAccessGroupSelectCriteria.AuthorityGroupOID.In(oidList); IList<DataAccessGroup> groups; using (IReadContext context = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var broker = context.GetBroker<IDataAccessGroupEntityBroker>(); groups = broker.Find(dataAccessGroupSelectCriteria); } var entityList = new List<ServerEntityKey>(); foreach (DataAccessGroup group in groups) { entityList.Add(group.Key); } var dataAccessSelectCriteria = new StudyDataAccessSelectCriteria(); dataAccessSelectCriteria.DataAccessGroupKey.In(entityList); criteria.StudyDataAccessRelatedEntityCondition.Exists(dataAccessSelectCriteria); } } DicomAttributeCollection data = message; foreach (DicomAttribute attrib in message) { tagList.Add(attrib.Tag.TagValue); if (!attrib.IsNull) switch (attrib.Tag.TagValue) { case DicomTags.StudyInstanceUid: QueryHelper.SetStringArrayCondition(criteria.StudyInstanceUid, (string[]) data[DicomTags.StudyInstanceUid].Values); break; case DicomTags.PatientsName: QueryHelper.SetStringCondition(criteria.PatientsName, data[DicomTags.PatientsName].GetString(0, string.Empty)); break; case DicomTags.PatientId: QueryHelper.SetStringCondition(criteria.PatientId, data[DicomTags.PatientId].GetString(0, string.Empty)); break; case DicomTags.PatientsBirthDate: QueryHelper.SetRangeCondition(criteria.PatientsBirthDate, data[DicomTags.PatientsBirthDate].GetString(0, string.Empty)); break; case DicomTags.PatientsSex: QueryHelper.SetStringCondition(criteria.PatientsSex, data[DicomTags.PatientsSex].GetString(0, string.Empty)); break; case DicomTags.StudyDate: QueryHelper.SetRangeCondition(criteria.StudyDate, data[DicomTags.StudyDate].GetString(0, string.Empty)); break; case DicomTags.StudyTime: QueryHelper.SetRangeCondition(criteria.StudyTime, data[DicomTags.StudyTime].GetString(0, string.Empty)); break; case DicomTags.AccessionNumber: QueryHelper.SetStringCondition(criteria.AccessionNumber, data[DicomTags.AccessionNumber].GetString(0, string.Empty)); break; case DicomTags.StudyId: QueryHelper.SetStringCondition(criteria.StudyId, data[DicomTags.StudyId].GetString(0, string.Empty)); break; case DicomTags.StudyDescription: QueryHelper.SetStringCondition(criteria.StudyDescription, data[DicomTags.StudyDescription].GetString(0, string.Empty)); break; case DicomTags.ReferringPhysiciansName: QueryHelper.SetStringCondition(criteria.ReferringPhysiciansName, data[DicomTags.ReferringPhysiciansName].GetString(0, string.Empty)); break; case DicomTags.ModalitiesInStudy: // Specify a subselect on Modality in series var seriesSelect = new SeriesSelectCriteria(); QueryHelper.SetStringArrayCondition(seriesSelect.Modality, (string[]) data[DicomTags.ModalitiesInStudy].Values); criteria.SeriesRelatedEntityCondition.Exists(seriesSelect); break; } } // Open another read context, in case additional queries are required. using (IReadContext subRead = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { // First find the Online studies var storageCriteria = new StudyStorageSelectCriteria(); storageCriteria.StudyStatusEnum.NotEqualTo(StudyStatusEnum.Nearline); storageCriteria.QueueStudyStateEnum.NotIn(new[] { QueueStudyStateEnum.DeleteScheduled, QueueStudyStateEnum.WebDeleteScheduled, QueueStudyStateEnum.EditScheduled }); criteria.StudyStorageRelatedEntityCondition.Exists(storageCriteria); find.Find(criteria, delegate(Study row) { var response = new DicomMessage(); //TODO (CR May 2010): should the availability be NEARLINE? The criteria above was for ONLINE studies. PopulateStudy(subRead, response, tagList, row, "NEARLINE"); del(response.DataSet); }); // Now find the Nearline studies storageCriteria = new StudyStorageSelectCriteria(); storageCriteria.StudyStatusEnum.EqualTo(StudyStatusEnum.Nearline); storageCriteria.QueueStudyStateEnum.NotIn(new[] { QueueStudyStateEnum.DeleteScheduled, QueueStudyStateEnum.WebDeleteScheduled, QueueStudyStateEnum.EditScheduled }); criteria.StudyStorageRelatedEntityCondition.Exists(storageCriteria); find.Find(criteria, delegate(Study row) { var response = new DicomMessage(); PopulateStudy(subRead, response, tagList, row, "NEARLINE"); del(response.DataSet); }); } } return; }