/// <summary> /// Find the <see cref="ServerEntityKey"/> reference for a given Study Instance UID and Server Partition. /// </summary> /// <param name="read">The connection to use to read the values.</param> /// <param name="studyInstanceUid">The list of Study Instance Uids for which to retrieve the table keys.</param> /// <returns>A list of <see cref="ServerEntityKey"/>s.</returns> protected List <ServerEntityKey> LoadStudyKey(IPersistenceContext read, string[] studyInstanceUid) { var find = read.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); if (Partition != null) { criteria.ServerPartitionKey.EqualTo(Partition.Key); } if (studyInstanceUid.Length > 1) { criteria.StudyInstanceUid.In(studyInstanceUid); } else { criteria.StudyInstanceUid.EqualTo(studyInstanceUid[0]); } IList <Study> list = find.Find(criteria); var serverList = new List <ServerEntityKey>(); foreach (Study row in list) { serverList.Add(row.GetKey()); } return(serverList); }
protected void LoadStudy() { if (String.IsNullOrEmpty(_studyInstanceUid)) { return; } if (_partition == null) { return; } StudyAdaptor studyAdaptor = new StudyAdaptor(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(_studyInstanceUid); criteria.ServerPartitionKey.EqualTo(Partition.GetKey()); Study study = studyAdaptor.GetFirst(HttpContextData.Current.ReadContext, criteria); if (study != null) { _study = StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, study); } else { StudyNotFoundException exception = new StudyNotFoundException(_studyInstanceUid); ExceptionHandler.ThrowException(exception); } StudyDetailsPanel.Study = _study; StudyDetailsPanel.DataBind(); }
/// <summary> /// Deletes the <see cref="StudyStorage"/> record /// </summary> /// <param name="item"></param> private void DeleteStudyStorage(Model.WorkQueue item) { using (IUpdateContext context = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { var study = context.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(StorageLocation.StudyInstanceUid); criteria.ServerPartitionKey.EqualTo(item.ServerPartitionKey); int count = study.Count(criteria); if (count == 0) { Platform.Log(LogLevel.Debug, "StudyProcess Cleanup: removing study storage record..."); var delete = context.GetBroker <IDeleteStudyStorage>(); var parms = new DeleteStudyStorageParameters { ServerPartitionKey = item.ServerPartitionKey, StudyStorageKey = item.StudyStorageKey }; delete.Execute(parms); context.Commit(); } } }
public IEnumerable <StudySummary> Select(int startRowIndex, int maximumRows) { if (maximumRows == 0 || Partition == null) { return(new List <StudySummary>()); } StudySelectCriteria criteria = GetSelectCriteria(); IList <Study> studyList = _searchController.GetRangeStudies(criteria, startRowIndex, maximumRows); _list = new List <StudySummary>(); foreach (Study study in studyList) { _list.Add(StudySummaryAssembler.CreateStudySummary(HttpContext.Current.GetSharedPersistentContext(), study)); } if (StudyFoundSet != null) { StudyFoundSet(_list); } return(_list); }
private static WorkQueueDetails CreateGeneralWorkQueueItemDetails(Model.WorkQueue item) { var detail = new WorkQueueDetails(); detail.Key = item.Key; detail.ScheduledDateTime = item.ScheduledTime; detail.ExpirationTime = item.ExpirationTime; detail.InsertTime = item.InsertTime; detail.FailureCount = item.FailureCount; detail.Type = item.WorkQueueTypeEnum; detail.Status = item.WorkQueueStatusEnum; detail.Priority = item.WorkQueuePriorityEnum; detail.FailureDescription = item.FailureDescription; detail.ServerDescription = item.ProcessorID; StudyStorageLocation storage = WorkQueueController.GetLoadStorageLocation(item); detail.StorageLocationPath = storage.GetStudyPath(); // Fetch UIDs var wqUidsAdaptor = new WorkQueueUidAdaptor(); var uidCriteria = new WorkQueueUidSelectCriteria(); uidCriteria.WorkQueueKey.EqualTo(item.GetKey()); IList <WorkQueueUid> uids = wqUidsAdaptor.Get(uidCriteria); var mapSeries = new Hashtable(); foreach (WorkQueueUid uid in uids) { if (mapSeries.ContainsKey(uid.SeriesInstanceUid) == false) { mapSeries.Add(uid.SeriesInstanceUid, uid.SopInstanceUid); } } detail.NumInstancesPending = uids.Count; detail.NumSeriesPending = mapSeries.Count; // Fetch the study and patient info var ssAdaptor = new StudyStorageAdaptor(); StudyStorage storages = ssAdaptor.Get(item.StudyStorageKey); var studyAdaptor = new StudyAdaptor(); var studycriteria = new StudySelectCriteria(); studycriteria.StudyInstanceUid.EqualTo(storages.StudyInstanceUid); studycriteria.ServerPartitionKey.EqualTo(item.ServerPartitionKey); Study study = studyAdaptor.GetFirst(studycriteria); // Study may not be available until the images are processed. if (study != null) { var studyAssembler = new StudyDetailsAssembler(); detail.Study = studyAssembler.CreateStudyDetail(study); } return(detail); }
static public Study Find(IPersistenceContext context, ServerEntityKey studyStorageKey) { var broker = context.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.StudyStorageKey.EqualTo(studyStorageKey); return(broker.FindOne(criteria)); }
public IList <Study> LoadRelatedStudies() { using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { IStudyEntityBroker broker = read.GetBroker <IStudyEntityBroker>(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.PatientKey.EqualTo(Key); return(broker.Find(criteria)); } }
public IList <Study> LoadRelatedStudies() { using (var context = new ServerExecutionContext()) { IStudyEntityBroker broker = context.ReadContext.GetBroker <IStudyEntityBroker>(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.PatientKey.EqualTo(Key); return(broker.Find(criteria)); } }
/// <summary> /// Find a <see cref="Study"/> with the specified study instance uid on the given partition. /// </summary> /// <param name="context"></param> /// <param name="studyInstanceUid"></param> /// <param name="partition"></param> /// <returns></returns> static public Study Find(IPersistenceContext context, String studyInstanceUid, ServerPartition partition) { var broker = context.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.ServerPartitionKey.EqualTo(partition.GetKey()); criteria.StudyInstanceUid.EqualTo(studyInstanceUid); Study study = broker.FindOne(criteria); return(study); }
private void LoadStudyPartition(string studyInstanceUid) { using (IReadContext read = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { IStudyEntityBroker selectStudy = read.GetBroker <IStudyEntityBroker>(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(studyInstanceUid); Study theStudy = selectStudy.FindOne(criteria); Partition = ServerPartition.Load(read, theStudy.ServerPartitionKey); } }
public int SelectCount() { if (Partition == null) { return(0); } StudySelectCriteria criteria = GetSelectCriteria(); ResultCount = _searchController.GetStudyCount(criteria); return(ResultCount); }
private void LoadSeriesDetails() { if (!String.IsNullOrEmpty(_serverae) && !String.IsNullOrEmpty(_studyInstanceUid) && !String.IsNullOrEmpty(_seriesInstanceUid)) { StudyAdaptor studyAdaptor = new StudyAdaptor(); SeriesSearchAdaptor seriesAdaptor = new SeriesSearchAdaptor(); ServerPartitionDataAdapter adaptor = new ServerPartitionDataAdapter(); ServerPartitionSelectCriteria criteria = new ServerPartitionSelectCriteria(); criteria.AeTitle.EqualTo(_serverae); Model.ServerPartition partition = adaptor.GetFirst(criteria); if (partition != null) { Partition = partition; StudySelectCriteria studyCriteria = new StudySelectCriteria(); studyCriteria.StudyInstanceUid.EqualTo(_studyInstanceUid); studyCriteria.ServerPartitionKey.EqualTo(Partition.GetKey()); Model.Study study = studyAdaptor.GetFirst(studyCriteria); if (study != null) { // there should be only one study _study = study; SeriesSelectCriteria seriesCriteria = new SeriesSelectCriteria(); seriesCriteria.SeriesInstanceUid.EqualTo(_seriesInstanceUid); Series series = seriesAdaptor.GetFirst(seriesCriteria); if (series != null) { _series = series; } } } } if (_study!=null && _series != null) { SeriesDetailsPanel1.Study = _study; SeriesDetailsPanel1.Series = _series; } DataBind(); }
private void Reload() { using (var ctx = PersistentStoreRegistry.GetDefaultStore().OpenReadContext()) { var broker = ctx.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.AccessionNumber.Like("%" + _accessionTextBox.Text + "%"); var studies = broker.Find(criteria); _studyList.Clear(); foreach (var item in studies) { _studyList.Add(new StudyItem(item)); } } }
protected override void OnInit(EventArgs e) { //This sets the GridView Page Size to the number of series. Needs to be done in the OnInit method, //since the page size needs to be set here, and the Study and Partition aren't set until the databind //happens in StudyDetailsTabs. var studyInstanceUID = Request.QueryString[ImageServerConstants.QueryStrings.StudyInstanceUID]; var serverAE = Request.QueryString[ImageServerConstants.QueryStrings.ServerAE]; if (!String.IsNullOrEmpty(studyInstanceUID) && !String.IsNullOrEmpty(serverAE)) { var adaptor = new ServerPartitionDataAdapter(); var partitionCriteria = new ServerPartitionSelectCriteria(); partitionCriteria.AeTitle.EqualTo(serverAE); IList <ServerPartition> partitions = adaptor.Get(partitionCriteria); if (partitions != null && partitions.Count > 0) { if (partitions.Count == 1) { var partition = partitions[0]; var studyAdaptor = new StudyAdaptor(); var studyCriteria = new StudySelectCriteria(); studyCriteria.StudyInstanceUid.EqualTo(studyInstanceUID); studyCriteria.ServerPartitionKey.EqualTo(partition.GetKey()); var study = studyAdaptor.GetFirst(studyCriteria); if (study != null) { var seriesAdaptor = new SeriesSearchAdaptor(); var criteria = new SeriesSelectCriteria(); criteria.StudyKey.EqualTo(study.GetKey()); criteria.ServerPartitionKey.EqualTo(partition.GetKey()); Series = seriesAdaptor.Get(criteria); GridView1.PageSize = Series.Count; } } } } else { GridView1.PageSize = 150; //Set it to a large number to ensure that all series are displayed if more than 25. } }
/// <summary> /// Constructs an instance of <see cref="WorkQueue"/> based on a <see cref="WorkQueueSummary"/> object. /// </summary> /// <param name="item"></param> /// <returns></returns> /// <remark> /// /// </remark> private RestoreQueueSummary CreateWorkQueueSummary(RestoreQueue item) { RestoreQueueSummary summary = new RestoreQueueSummary(); summary.TheRestoreQueueItem = item; summary.ThePartition = Partition; if (item.FailureDescription == null) { summary.Notes = String.Empty; } else { summary.Notes = item.FailureDescription; } // Fetch the patient info: StudyStorageAdaptor ssAdaptor = new StudyStorageAdaptor(); summary.StudyStorage = ssAdaptor.Get(item.StudyStorageKey); if (summary.StudyStorage == null) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; return(summary); } StudyAdaptor studyAdaptor = new StudyAdaptor(); StudySelectCriteria studycriteria = new StudySelectCriteria(); studycriteria.StudyInstanceUid.EqualTo(summary.StudyStorage.StudyInstanceUid); studycriteria.ServerPartitionKey.EqualTo(summary.StudyStorage.ServerPartitionKey); IList <Study> studyList = studyAdaptor.Get(studycriteria); if (studyList == null || studyList.Count == 0) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; } else { summary.PatientId = studyList[0].PatientId; summary.PatientsName = studyList[0].PatientsName; } return(summary); }
/// <summary> /// Constructs an instance of <see cref="WorkQueueSummary"/> based on a <see cref="WorkQueue"/> object. /// </summary> /// <param name="item"></param> /// <returns></returns> /// <remark> /// /// </remark> private ArchiveQueueSummary CreateWorkQueueSummary(ArchiveQueue item) { ArchiveQueueSummary summary = new ArchiveQueueSummary(); summary.TheArchiveQueueItem = item; summary.ThePartition = Partition; if (item.FailureDescription == null) { summary.Notes = String.Empty; } else { summary.Notes = item.FailureDescription; } // Fetch the patient info: StudyStorageAdaptor ssAdaptor = new StudyStorageAdaptor(); summary.StudyStorage = ssAdaptor.Get(item.StudyStorageKey); if (summary.StudyStorage == null) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; return(summary); } StudyAdaptor studyAdaptor = new StudyAdaptor(); StudySelectCriteria studycriteria = new StudySelectCriteria(); studycriteria.StudyInstanceUid.EqualTo(summary.StudyStorage.StudyInstanceUid); studycriteria.ServerPartitionKey.EqualTo(summary.StudyStorage.ServerPartitionKey); Study theStudy = studyAdaptor.GetFirst(studycriteria); if (theStudy == null) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; } else { summary.PatientId = theStudy.PatientId; summary.PatientsName = theStudy.PatientsName; } return(summary); }
/// <summary> /// Create a list of SOP Instances to move based on a Patient level C-MOVE-RQ. /// </summary> /// <param name="read"></param> /// <param name="msg"></param> /// <param name="errorComment"> </param> /// <returns></returns> private bool GetSopListForPatient(IPersistenceContext read, DicomMessageBase msg, out string errorComment) { errorComment = string.Empty; string patientId = msg.DataSet[DicomTags.PatientId].GetString(0, ""); var select = read.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.PatientId.EqualTo(patientId); criteria.ServerPartitionKey.EqualTo(Partition.Key); IList <Study> studyList = select.Find(criteria); bool bOfflineFound = false; foreach (Study study in studyList) { StudyStorageLocation location; try { FilesystemMonitor.Instance.GetReadableStudyStorageLocation(Partition.Key, study.StudyInstanceUid, StudyRestore.True, StudyCache.True, out location); } catch (StudyIsNearlineException e) { errorComment = string.Format(e.RestoreRequested ? "Study is nearline, inserted restore request: {0}" : "Study is nearline: {0}", study.StudyInstanceUid); bOfflineFound = true; continue; } catch (Exception e) { errorComment = string.Format("Exception occurred when determining study location: {0}", e.Message); bOfflineFound = true; continue; } StudyXml theStream = LoadStudyXml(location); _theScu.LoadStudyFromStudyXml(location.GetStudyPath(), theStream); } return(!bOfflineFound); }
protected Study LoadStudy(string studyInstanceUID) { if (String.IsNullOrEmpty(studyInstanceUID)) { return(null); } if (_partition == null) { return(null); } StudyAdaptor studyAdaptor = new StudyAdaptor(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(studyInstanceUID); criteria.ServerPartitionKey.EqualTo(Partition.Key); return(studyAdaptor.GetFirst(criteria)); }
protected override void OnInit(EventArgs e) { base.OnInit(e); StudyController studyController = new StudyController(); ServerPartitionConfigController partitionConfigController = new ServerPartitionConfigController(); string serverae = Request.QueryString[QUERY_KEY_SERVER_AE]; if (!String.IsNullOrEmpty(serverae)) { // Load the Partition ServerPartitionSelectCriteria partitionCriteria = new ServerPartitionSelectCriteria(); partitionCriteria.AeTitle.EqualTo(serverae); IList <ServerPartition> list = partitionConfigController.GetPartitions(partitionCriteria); this.Move.Partition = list[0]; for (int i = 1;; i++) { string studyuid = Request.QueryString[String.Format("{0}{1}", QUERY_KEY_STUDY_INSTANCE_UID, i)]; if (!String.IsNullOrEmpty(studyuid)) { _uids.Add(studyuid, serverae); StudySelectCriteria studyCriteria = new StudySelectCriteria(); studyCriteria.StudyInstanceUid.EqualTo(studyuid); studyCriteria.ServerPartitionKey.EqualTo(list[0].GetKey()); IList <Study> studyList = studyController.GetStudies(studyCriteria); this.Move.StudyGridView.StudyList.Add(studyList[0]); this.Move.StudyGridView.Partition = this.Move.Partition; } else { break; } } } SetPageTitle(Titles.MoveStudiesPageTitle); }
/// <summary> /// Create a list of DICOM SOP Instances to move based on a Series level C-MOVE-RQ /// </summary> /// <param name="persistenceContext"></param> /// <param name="msg"></param> /// <param name="errorComment"> </param> /// <returns></returns> private bool GetSopListForSeries(IPersistenceContext persistenceContext, DicomMessageBase msg, out string errorComment) { errorComment = string.Empty; string studyInstanceUid = msg.DataSet[DicomTags.StudyInstanceUid].GetString(0, ""); var seriesList = (string[])msg.DataSet[DicomTags.SeriesInstanceUid].Values; // Now get the storage location StudyStorageLocation location; try { FilesystemMonitor.Instance.GetReadableStudyStorageLocation(Partition.Key, studyInstanceUid, StudyRestore.True, StudyCache.True, out location); } catch (StudyIsNearlineException e) { errorComment = string.Format(e.RestoreRequested ? "Study is nearline, inserted restore request: {0}" : "Study is nearline: {0}", studyInstanceUid); return(false); } catch (Exception e) { errorComment = string.Format("Exception occurred when determining study location: {0}", e.Message); return(false); } var select = persistenceContext.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(studyInstanceUid); criteria.ServerPartitionKey.EqualTo(Partition.Key); Study study = select.FindOne(criteria); StudyXml studyStream = LoadStudyXml(location); foreach (string seriesInstanceUid in seriesList) { _theScu.LoadSeriesFromSeriesXml(studyStream, Path.Combine(location.GetStudyPath(), seriesInstanceUid), studyStream[seriesInstanceUid], study.PatientsName, study.PatientId); } return(true); }
private Study GetStudyAndQueues(StudyStorageLocation location, out int integrityQueueCount, out int workQueueCount) { using (IReadContext context = _store.OpenReadContext()) { IStudyIntegrityQueueEntityBroker integrityBroker = context.GetBroker <IStudyIntegrityQueueEntityBroker>(); StudyIntegrityQueueSelectCriteria integrityCriteria = new StudyIntegrityQueueSelectCriteria(); integrityCriteria.StudyStorageKey.EqualTo(location.Key); integrityQueueCount = integrityBroker.Count(integrityCriteria); IWorkQueueEntityBroker workBroker = context.GetBroker <IWorkQueueEntityBroker>(); WorkQueueSelectCriteria workCriteria = new WorkQueueSelectCriteria(); workCriteria.StudyStorageKey.EqualTo(location.Key); workQueueCount = workBroker.Count(workCriteria); IStudyEntityBroker procedure = context.GetBroker <IStudyEntityBroker>(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.StudyStorageKey.EqualTo(location.Key); return(procedure.FindOne(criteria)); } }
public bool DeleteOrderItem(ServerEntityKey partitionKey, ServerEntityKey orderKey) { using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { // Disconnect studies from order var studyBroker = updateContext.GetBroker <IStudyEntityBroker>(); var criteria = new StudySelectCriteria(); criteria.OrderKey.EqualTo(orderKey); criteria.ServerPartitionKey.EqualTo(partitionKey); var updateColumns = new StudyUpdateColumns { OrderKey = null }; studyBroker.Update(criteria, updateColumns); bool retValue = _adaptor.Delete(updateContext, orderKey); updateContext.Commit(); return(retValue); } }
/// <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; }
protected void Page_Load(object sender, EventArgs e) { UserID = Request.Params[ImageServerConstants.WebViewerQueryStrings.Username]; Password = Request.Params[ImageServerConstants.WebViewerQueryStrings.Password]; AppName = Request.Params[ImageServerConstants.WebViewerQueryStrings.ApplicationName]; ListStudies = Request.Params[ImageServerConstants.WebViewerQueryStrings.ListStudies]; WebViewerInitString = Request.Params[ImageServerConstants.WebViewerQueryStrings.WebViewerInitParams]; //Try to authenticate the user if (!string.IsNullOrEmpty(UserID) && !string.IsNullOrEmpty(Password)) { if (String.IsNullOrEmpty(AppName)) { int start = WebViewerInitString.IndexOf(ImageServerConstants.WebViewerQueryStrings.ApplicationName + "="); if (start < 0) { AppName = ImageServerConstants.DefaultApplicationName; } else { start += (ImageServerConstants.WebViewerQueryStrings.ApplicationName + "=").Length; AppName = WebViewerInitString.Substring(start); int end = AppName.IndexOf(','); AppName = AppName.Substring(0, end); if (string.IsNullOrEmpty(AppName)) { AppName = ImageServerConstants.DefaultApplicationName; } } } AppName = String.Format("{0}@{1}", AppName, HttpContext.Current.Request.UserHostName); try { using (LoginService service = new LoginService()) { SessionInfo session = service.Login(UserID, Password, AppName); Platform.Log(LogLevel.Info, "[{0}]: {1} has successfully logged in.", AppName, UserID); WebViewerInitString += string.Format(",{0}={1},{2}={3}", ImageServerConstants.WebViewerQueryStrings.Username, UserID, ImageServerConstants.WebViewerQueryStrings.Session, session.Credentials.SessionToken.Id); //_sessionId = session.Credentials.SessionToken.Id; //Add the session information to the context in case we redirect to the studies page. //We need these to properly launch the WebViewer Context.Items.Add(ImageServerConstants.WebViewerQueryStrings.Username, UserID); Context.Items.Add(ImageServerConstants.WebViewerQueryStrings.Session, session.Credentials.SessionToken.Id); Context.Items.Add("Authorized", false); foreach (string role in session.Credentials.Authorities) { if (role.Equals(Macro.ImageServer.Enterprise.Authentication.AuthorityTokens.Study.ViewImages)) { Context.Items["Authorized"] = "true"; break; } } } } catch (PasswordExpiredException) { Platform.Log(LogLevel.Info, "[{0}]: {1} encountered PasswordExpiredException.", AppName, UserID); Server.Transfer(ImageServerConstants.PageURLs.WebViewerAuthorizationErrorPage, true); } catch (UserAccessDeniedException) { Platform.Log(LogLevel.Info, "[{0}]: {1} encountered UserAccessDeniedException.", AppName, UserID); Server.Transfer(ImageServerConstants.PageURLs.WebViewerAuthorizationErrorPage, true); } catch (Exception ex) { Platform.Log(LogLevel.Info, "[{0}]: {1} encountered exception {2} - {3}.", AppName, UserID, ex.GetType(), ex.Message); Server.Transfer(ImageServerConstants.PageURLs.WebViewerAuthorizationErrorPage, true); } if (!string.IsNullOrEmpty(ListStudies) && ListStudies.Equals("true")) { //Extract the WebViewer Init Parameters to determine whether or not we need //to redirect to the Studies page. var initParams = new WebViewerInitParams(); string[] vals = HttpUtility.UrlDecode(WebViewerInitString).Split(new[] { '?', ';', '=', ',', '&' }); for (int i = 0; i < vals.Length - 1; i++) { if (String.IsNullOrEmpty(vals[i])) { continue; } if (vals[i].Equals(ImageServerConstants.WebViewerStartupParameters.Study)) { i++; initParams.StudyInstanceUids.Add(vals[i]); } else if (vals[i].Equals(ImageServerConstants.WebViewerStartupParameters.PatientID)) { i++; initParams.PatientIds.Add(vals[i]); } else if (vals[i].Equals(ImageServerConstants.WebViewerStartupParameters.AeTitle)) { i++; initParams.AeTitle = vals[i]; } else if (vals[i].Equals(ImageServerConstants.WebViewerStartupParameters.AccessionNumber)) { i++; initParams.AccessionNumbers.Add(vals[i]); } } //Check if there are multiple studies to be displayed. var controller = new StudyController(); var partitionAdapter = new ServerPartitionDataAdapter(); var partitionCriteria = new ServerPartitionSelectCriteria(); StudySelectCriteria studyCriteria; ServerPartition partition = null; int studyCount = 0; if (!string.IsNullOrEmpty(initParams.AeTitle)) { partitionCriteria.AeTitle.EqualTo(initParams.AeTitle); IList <ServerPartition> partitions = partitionAdapter.GetServerPartitions(partitionCriteria); //TODO: What if the AE Title is invalid? if (partitions.Count == 1) { partition = partitions[0]; } } //TODO: The logic below is very weird. foreach (string patientId in initParams.PatientIds) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } SetStringCondition(studyCriteria.PatientId, patientId); studyCount += controller.GetStudyCount(studyCriteria); } if (studyCount < 2) { foreach (string accession in initParams.AccessionNumbers) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } SetStringCondition(studyCriteria.AccessionNumber, accession); // TODO: studyCount is either 0 or 1 entering this block. If the same study is found, studyCount is incremented to 2, which is wrong studyCount += controller.GetStudyCount(studyCriteria); } } if (studyCount < 2 && initParams.StudyInstanceUids.Count > 0) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } studyCriteria.StudyInstanceUid.In(initParams.StudyInstanceUids); // TODO: studyCount is either 0 or 1 entering this block. If the same study is found, studyCount is incremented to 2, which is wrong studyCount += controller.GetStudyCount(studyCriteria); } if (studyCount > 1) { Server.Transfer(ImageServerConstants.PageURLs.WebViewerStudiesPage, true); } } if (string.IsNullOrEmpty(WebViewerInitString)) { Response.Redirect(ImageServerConstants.PageURLs.WebViewerDefaultPage, true); } else { Response.Redirect(ImageServerConstants.PageURLs.WebViewerDefaultPage + "?" + ImageServerConstants.WebViewerQueryStrings.WebViewerInitParams + "=" + WebViewerInitString, true); } } else { Server.Transfer(ImageServerConstants.PageURLs.WebViewerAuthorizationErrorPage, true); } }
/// <summary> /// Do the insertion of the AutoRoute. /// </summary> protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { var deviceSelectCriteria = new DeviceSelectCriteria(); deviceSelectCriteria.AeTitle.EqualTo(_deviceAe); deviceSelectCriteria.ServerPartitionKey.EqualTo(_context.ServerPartitionKey); var selectDevice = updateContext.GetBroker <IDeviceEntityBroker>(); var dev = selectDevice.FindOne(deviceSelectCriteria); if (dev == null) { Platform.Log(LogLevel.Warn, "Device '{0}' on partition {1} not in database for autoroute request! Ignoring request.", _deviceAe, _context.ServerPartition.AeTitle); ServerPlatform.Alert( AlertCategory.Application, AlertLevel.Warning, SR.AlertComponentAutorouteRule, AlertTypeCodes.UnableToProcess, null, TimeSpan.FromMinutes(5), SR.AlertAutoRouteUnknownDestination, _deviceAe, _context.ServerPartition.AeTitle); return; } if (!dev.AllowAutoRoute) { Platform.Log(LogLevel.Warn, "Study Auto-route attempted to device {0} on partition {1} with autoroute support disabled. Ignoring request.", dev.AeTitle, _context.ServerPartition.AeTitle); ServerPlatform.Alert(AlertCategory.Application, AlertLevel.Warning, SR.AlertComponentAutorouteRule, AlertTypeCodes.UnableToProcess, null, TimeSpan.FromMinutes(5), SR.AlertAutoRouteDestinationAEDisabled, dev.AeTitle, _context.ServerPartition.AeTitle); return; } if (_qcStatus != null) { var studyBroker = updateContext.GetBroker <IStudyEntityBroker>(); var studySelect = new StudySelectCriteria(); studySelect.StudyStorageKey.EqualTo(_context.StudyLocationKey); studySelect.ServerPartitionKey.EqualTo(_context.ServerPartitionKey); var study = studyBroker.FindOne(studySelect); if (!study.QCStatusEnum.Equals(_qcStatus)) { Platform.Log(LogLevel.Debug, "Ignoring Auto-route where the QCStatusEnum status must be {0}, but database has {1} for study {2}", _qcStatus.Description, study.QCStatusEnum.Description, study.StudyInstanceUid); return; } } var parms = new InsertWorkQueueParameters { WorkQueueTypeEnum = WorkQueueTypeEnum.StudyAutoRoute, ScheduledTime = _scheduledTime.HasValue ? _scheduledTime.Value : Platform.Time.AddSeconds(30), StudyStorageKey = _context.StudyLocationKey, ServerPartitionKey = _context.ServerPartitionKey, DeviceKey = dev.GetKey() }; var broker = updateContext.GetBroker <IInsertWorkQueue>(); if (broker.FindOne(parms) == null) { throw new ApplicationException("InsertWorkQueue for Study Auto-Route failed"); } }
private StudySelectCriteria GetSelectCriteria() { var criteria = new StudySelectCriteria(); // only query for device in this partition criteria.ServerPartitionKey.EqualTo(Partition.Key); QueryHelper.SetGuiStringCondition(criteria.PatientId, PatientId); QueryHelper.SetGuiStringCondition(criteria.PatientsName, PatientName); criteria.PatientsName.SortAsc(0); QueryHelper.SetGuiStringCondition(criteria.AccessionNumber, AccessionNumber); if (!String.IsNullOrEmpty(ToStudyDate) && !String.IsNullOrEmpty(FromStudyDate)) { string toKey = DateTime.ParseExact(ToStudyDate, DateFormats, null).ToString(STUDYDATE_DATEFORMAT, CultureInfo.InvariantCulture) + " 23:59:59.997"; string fromKey = DateTime.ParseExact(FromStudyDate, DateFormats, null).ToString(STUDYDATE_DATEFORMAT, CultureInfo.InvariantCulture); criteria.StudyDate.Between(fromKey, toKey); } else if (!String.IsNullOrEmpty(ToStudyDate)) { string toKey = DateTime.ParseExact(ToStudyDate, DateFormats, null).ToString(STUDYDATE_DATEFORMAT, CultureInfo.InvariantCulture); criteria.StudyDate.LessThanOrEqualTo(toKey); } else if (!String.IsNullOrEmpty(FromStudyDate)) { string fromKey = DateTime.ParseExact(FromStudyDate, DateFormats, null).ToString(STUDYDATE_DATEFORMAT, CultureInfo.InvariantCulture); criteria.StudyDate.MoreThanOrEqualTo(fromKey); } QueryHelper.SetGuiStringCondition(criteria.StudyDescription, StudyDescription); QueryHelper.SetGuiStringCondition(criteria.ReferringPhysiciansName, ReferringPhysiciansName); QueryHelper.SetGuiStringCondition(criteria.ResponsiblePerson, ResponsiblePerson); QueryHelper.SetGuiStringCondition(criteria.ResponsibleOrganization, ResponsibleOrganization); if (Modalities != null && Modalities.Length > 0) { var seriesCriteria = new SeriesSelectCriteria(); QueryHelper.SetStringArrayCondition(seriesCriteria.Modality, Modalities); criteria.SeriesRelatedEntityCondition.Exists(seriesCriteria); } if (Statuses != null && Statuses.Length > 0) { var storageCriteria = new StudyStorageSelectCriteria(); if (Statuses.Length == 1) { storageCriteria.StudyStatusEnum.EqualTo(StudyStatusEnum.GetEnum(Statuses[0])); } else { var statusList = new List <StudyStatusEnum>(); foreach (string status in Statuses) { statusList.Add(StudyStatusEnum.GetEnum(status)); } storageCriteria.StudyStatusEnum.In(statusList); } criteria.StudyStorageRelatedEntityCondition.Exists(storageCriteria); } if (QCStatuses != null && QCStatuses.Length > 0) { criteria.QCStatusEnum.In(QCStatuses); } return(criteria); }
private static IList <StudySummary> LoadStudies(WebViewerInitParams initParams) { ValidateParameters(initParams); var controller = new StudyController(); var partitionAdapter = new ServerPartitionDataAdapter(); StudySelectCriteria studyCriteria; var partitionCriteria = new ServerPartitionSelectCriteria(); ServerPartition partition = null; IList <Study> studies; List <StudySummary> totalStudies = new List <StudySummary>(); if (!string.IsNullOrEmpty(initParams.AeTitle)) { partitionCriteria.AeTitle.EqualTo(initParams.AeTitle); IList <ServerPartition> partitions = partitionAdapter.GetServerPartitions(partitionCriteria); if (partitions.Count == 1) { partition = partitions[0]; } } foreach (string patientId in initParams.PatientIds) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } SetStringCondition(studyCriteria.PatientId, patientId); studyCriteria.StudyDate.SortDesc(0); studies = controller.GetStudies(studyCriteria); foreach (Study study in studies) { totalStudies.Add(StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, study)); } } foreach (string accession in initParams.AccessionNumbers) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } SetStringCondition(studyCriteria.AccessionNumber, accession); studyCriteria.StudyDate.SortDesc(0); studies = controller.GetStudies(studyCriteria); foreach (Study study in studies) { totalStudies.Add(StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, study)); } } if (initParams.StudyInstanceUids.Count > 0) { studyCriteria = new StudySelectCriteria(); if (partition != null) { studyCriteria.ServerPartitionKey.EqualTo(partition.Key); } studyCriteria.StudyInstanceUid.In(initParams.StudyInstanceUids); studyCriteria.StudyDate.SortDesc(0); studies = controller.GetStudies(studyCriteria); foreach (Study study in studies) { totalStudies.Add(StudySummaryAssembler.CreateStudySummary(HttpContextData.Current.ReadContext, study)); } } totalStudies.Sort((a, b) => a.StudyDate.CompareTo(b.StudyDate) * -1); return(totalStudies); }
/// <summary> /// Constructs an instance of <see cref="WorkQueueSummary"/> based on a <see cref="WorkQueue"/> object. /// </summary> /// <param name="item"></param> /// <returns></returns> /// <remark> /// /// </remark> private WorkQueueSummary CreateWorkQueueSummary(WorkQueue item) { WorkQueueSummary summary = new WorkQueueSummary { TheWorkQueueItem = item, ThePartition = Partition }; // Fetch the patient info: StudyStorageAdaptor ssAdaptor = new StudyStorageAdaptor(); StudyStorage storages = ssAdaptor.Get(item.StudyStorageKey); if (storages == null) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; return(summary); } StudyAdaptor studyAdaptor = new StudyAdaptor(); StudySelectCriteria studycriteria = new StudySelectCriteria(); studycriteria.StudyInstanceUid.EqualTo(storages.StudyInstanceUid); studycriteria.ServerPartitionKey.EqualTo(item.ServerPartitionKey); IList <Study> studyList = studyAdaptor.Get(studycriteria); if (studyList == null || studyList.Count == 0) { summary.PatientId = "N/A"; summary.PatientsName = "N/A"; } else { summary.PatientId = studyList[0].PatientId; summary.PatientsName = studyList[0].PatientsName; } if (item.WorkQueueTypeEnum == WorkQueueTypeEnum.WebMoveStudy || item.WorkQueueTypeEnum == WorkQueueTypeEnum.AutoRoute) { DeviceDataAdapter deviceAdaptor = new DeviceDataAdapter(); Device dest = deviceAdaptor.Get(item.DeviceKey); summary.Notes = String.Format("Destination AE : {0}", dest.AeTitle); if (item.FailureDescription != null) { summary.FullDescription = String.Format("{0}, {1}", summary.Notes, item.FailureDescription); //Set the FullDescription for the Tooltip in the GUI summary.Notes = summary.FullDescription.Length > 60 ? summary.FullDescription.Substring(0, 60) : summary.FullDescription; } } else if (item.FailureDescription != null) { // This used to only be shown when the status was "Failed" for a // queue entry. We now show it any time there's if (item.FailureDescription.Length > 60) { summary.Notes = item.FailureDescription.Substring(0, 60); summary.Notes += " ..."; summary.FullDescription = item.FailureDescription; //Set the FullDescription for the Tooltip in the GUI } else { summary.Notes = item.FailureDescription; } } summary.RequiresAttention = item.WorkQueueStatusEnum.Equals(WorkQueueStatusEnum.Failed) || !ServerPlatform.IsActiveWorkQueue(item); return(summary); }
private static WorkQueueDetails CreateEditWorkQueueItemDetails(Model.WorkQueue item) { string studyPath; try { StudyStorageLocation storage = WorkQueueController.GetLoadStorageLocation(item); studyPath = storage.GetStudyPath(); } catch (Exception) { studyPath = string.Empty; } var detail = new WorkQueueDetails { Key = item.Key, ScheduledDateTime = item.ScheduledTime, ExpirationTime = item.ExpirationTime, InsertTime = item.InsertTime, FailureCount = item.FailureCount, Type = item.WorkQueueTypeEnum, Status = item.WorkQueueStatusEnum, Priority = item.WorkQueuePriorityEnum, FailureDescription = item.FailureDescription, ServerDescription = item.ProcessorID, StorageLocationPath = studyPath }; // Fetch UIDs var wqUidsAdaptor = new WorkQueueUidAdaptor(); var uidCriteria = new WorkQueueUidSelectCriteria(); uidCriteria.WorkQueueKey.EqualTo(item.GetKey()); IList <WorkQueueUid> uids = wqUidsAdaptor.Get(uidCriteria); var mapSeries = new Hashtable(); foreach (WorkQueueUid uid in uids) { if (mapSeries.ContainsKey(uid.SeriesInstanceUid) == false) { mapSeries.Add(uid.SeriesInstanceUid, uid.SopInstanceUid); } } detail.NumInstancesPending = uids.Count; detail.NumSeriesPending = mapSeries.Count; // Fetch the study and patient info var ssAdaptor = new StudyStorageAdaptor(); StudyStorage storages = ssAdaptor.Get(item.StudyStorageKey); var studyAdaptor = new StudyAdaptor(); var studycriteria = new StudySelectCriteria(); studycriteria.StudyInstanceUid.EqualTo(storages.StudyInstanceUid); studycriteria.ServerPartitionKey.EqualTo(item.ServerPartitionKey); Study study = studyAdaptor.GetFirst(studycriteria); // Study may not be available until the images are processed. if (study != null) { var studyAssembler = new StudyDetailsAssembler(); detail.Study = studyAssembler.CreateStudyDetail(study); } var parser = new EditStudyWorkQueueDataParser(); EditStudyWorkQueueData data = parser.Parse(item.Data.DocumentElement); detail.EditUpdateItems = data.EditRequest.UpdateEntries.ToArray(); return(detail); }
protected void Page_Load(object sender, EventArgs e) { ServerPartitionConfigController partitionConfigController = new ServerPartitionConfigController(); string serverae = Request.QueryString[ImageServerConstants.QueryStrings.ServerAE]; if (!String.IsNullOrEmpty(serverae)) { // Load the Partition ServerPartitionSelectCriteria partitionCriteria = new ServerPartitionSelectCriteria(); partitionCriteria.AeTitle.EqualTo(serverae); IList <ServerPartition> list = partitionConfigController.GetPartitions(partitionCriteria); Partition = list[0]; SeriesGridView.Partition = Partition; string studyuid = Request.QueryString[ImageServerConstants.QueryStrings.StudyUID]; if (!String.IsNullOrEmpty(studyuid) || Partition != null) { StudyController studyController = new StudyController(); StudySelectCriteria criteria = new StudySelectCriteria(); criteria.StudyInstanceUid.EqualTo(studyuid); criteria.ServerPartitionKey.EqualTo(Partition.Key); IList <Study> studyList = studyController.GetStudies(criteria); SelectedStudy = studyList[0]; SeriesGridView.Study = studyList[0]; PatientSummary.PatientSummary = PatientSummaryAssembler.CreatePatientSummary(studyList[0]); StudySummary.Study = studyList[0]; } } if (DHCPFilter.Items.Count == 0) { DHCPFilter.Items.Add(new ListItem(SR.All)); DHCPFilter.Items.Add(new ListItem(SR.DHCP)); DHCPFilter.Items.Add(new ListItem(SR.NoDHCP)); } IList <DeviceTypeEnum> deviceTypes = DeviceTypeEnum.GetAll(); if (DeviceTypeFilter.Items.Count == 0) { foreach (DeviceTypeEnum t in deviceTypes) { DeviceTypeFilter.Items.Add(new ListItem(ServerEnumDescription.GetLocalizedDescription(t), t.Lookup)); } } else { ListItem[] typeItems = new ListItem[DeviceTypeFilter.Items.Count]; DeviceTypeFilter.Items.CopyTo(typeItems, 0); DeviceTypeFilter.Items.Clear(); int count = 0; foreach (DeviceTypeEnum t in deviceTypes) { DeviceTypeFilter.Items.Add(new ListItem(ServerEnumDescription.GetLocalizedDescription(t), t.Lookup)); DeviceTypeFilter.Items[count].Selected = typeItems[count].Selected; count++; } } LoadSeries(); LoadDevices(); DataBind(); }