/// <summary>
        /// Load the <see cref="ServerRulesEngine"/> for each partition.
        /// </summary>
        private void LoadRulesEngine()
        {
            using (var context = new ServerExecutionContext())
            {
                var broker   = context.ReadContext.GetBroker <IServerPartitionEntityBroker>();
                var criteria = new ServerPartitionSelectCriteria();
                IList <ServerPartition> partitions = broker.Find(criteria);

                foreach (ServerPartition partition in partitions)
                {
                    //TODO CR (Jan 2014) - Cached engine not being used now, due to #11673
                    var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
                    engine.Load();
                    _engines.Add(partition, engine);

                    engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key);
                    engine.Load();
                    _postArchivalEngines.Add(partition, engine);

                    engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
                    engine.AddIncludeType(ServerRuleTypeEnum.DataAccess);
                    engine.Load();
                    _dataAccessEngine.Add(partition, engine);
                }
            }
        }
예제 #2
0
 public UpdateStudyCommand(ServerPartition partition,
                           StudyStorageLocation studyLocation,
                           IList <BaseImageLevelUpdateCommand> imageLevelCommands,
                           ServerRuleApplyTimeEnum applyTime)
     : base("Update existing study")
 {
     _partition        = partition;
     _oldStudyLocation = studyLocation;
     _commands         = imageLevelCommands;
     _statistics       = new UpdateStudyStatistics(_oldStudyLocation.StudyInstanceUid);
     // Load the engine for editing rules.
     _rulesEngine = new ServerRulesEngine(applyTime, _partition.Key);
     if (applyTime.Equals(ServerRuleApplyTimeEnum.SopProcessed))
     {
         _rulesEngine.AddIncludeType(ServerRuleTypeEnum.AutoRoute);
     }
     _rulesEngine.Load();
 }
        /// <summary>
        /// Load the <see cref="ServerRulesEngine"/> for each partition.
        /// </summary>
        private void LoadRulesEngine()
        {
			using (var context = new ServerExecutionContext())
			{
				var broker = context.ReadContext.GetBroker<IServerPartitionEntityBroker>();
				var criteria = new ServerPartitionSelectCriteria();
				IList<ServerPartition> partitions = broker.Find(criteria);

				foreach (ServerPartition partition in partitions)
				{
					//TODO CR (Jan 2014) - Cached engine not being used now, due to #11673
					var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
                    engine.Load();
                    _engines.Add(partition, engine);
					
					engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key);
                    engine.Load();
                    _postArchivalEngines.Add(partition, engine);

                    engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
				    engine.AddIncludeType(ServerRuleTypeEnum.DataAccess);
                    engine.Load(); 
                    _dataAccessEngine.Add(partition, engine);
                    
				}
			}
        }
예제 #4
0
		public UpdateStudyCommand(ServerPartition partition, 
		                          StudyStorageLocation studyLocation,
		                          IList<BaseImageLevelUpdateCommand> imageLevelCommands,
								  ServerRuleApplyTimeEnum applyTime,
								  WorkQueue workQueue) 
			: base("Update existing study")
		{
			_partition = partition;
			_oldStudyLocation = studyLocation;
			_commands = imageLevelCommands;
			_workQueue = workQueue;
			_statistics = new UpdateStudyStatistics(_oldStudyLocation.StudyInstanceUid);
			// Load the engine for editing rules.
			_rulesEngine = new ServerRulesEngine(applyTime, _partition.Key);
			if (applyTime.Equals(ServerRuleApplyTimeEnum.SopProcessed))
				_rulesEngine.AddIncludeType(ServerRuleTypeEnum.AutoRoute);
			_rulesEngine.Load();
		}
        /// <summary>
        /// Reprocess a file systems
        /// </summary>
        /// <param name="partition"></param>
        private void ReprocessPartition(ServerPartition partition)
        {
            var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);

            engine.Load();

            var postArchivalEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key);

            postArchivalEngine.Load();

            var dataAccessEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);

            dataAccessEngine.AddIncludeType(ServerRuleTypeEnum.DataAccess);
            dataAccessEngine.Load();

            var filesystems = FilesystemMonitor.Instance.GetFilesystems();

            foreach (var f in filesystems)
            {
                var partitionDir  = Path.Combine(f.Filesystem.FilesystemPath, partition.PartitionFolder);
                var filesystemDir = new DirectoryInfo(partitionDir);
                foreach (DirectoryInfo dateDir in filesystemDir.GetDirectories())
                {
                    if (dateDir.FullName.EndsWith("Deleted") ||
                        dateDir.FullName.EndsWith(ServerPlatform.ReconcileStorageFolder))
                    {
                        continue;
                    }

                    foreach (DirectoryInfo studyDir in dateDir.GetDirectories())
                    {
                        String studyInstanceUid = studyDir.Name;
                        try
                        {
                            StudyStorageLocation location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid);
                            if (location == null)
                            {
                                foreach (DirectoryInfo seriesDir in studyDir.GetDirectories())
                                {
                                    FileInfo[] sopInstanceFiles = seriesDir.GetFiles("*.dcm");

                                    DicomFile file = null;
                                    foreach (FileInfo sopFile in sopInstanceFiles)
                                    {
                                        if (!sopFile.FullName.EndsWith(ServerPlatform.DicomFileExtension))
                                        {
                                            continue;
                                        }

                                        try
                                        {
                                            file = new DicomFile(sopFile.FullName);
                                            file.Load(DicomTags.StudyId, DicomReadOptions.DoNotStorePixelDataInDataSet | DicomReadOptions.Default);
                                            break;
                                        }
                                        catch (Exception e)
                                        {
                                            Platform.Log(LogLevel.Warn, e, "Unexpected failure loading file: {0}.  Continuing to next file.",
                                                         sopFile.FullName);
                                            file = null;
                                        }
                                    }
                                    if (file != null)
                                    {
                                        studyInstanceUid = file.DataSet[DicomTags.StudyInstanceUid].ToString();
                                        break;
                                    }
                                }

                                location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid);
                                if (location == null)
                                {
                                    continue;
                                }
                            }

                            ProcessStudy(partition, location, engine, postArchivalEngine, dataAccessEngine);
                            //_stats.NumStudies++;

                            if (CancelPending)
                            {
                                return;
                            }
                        }
                        catch (Exception e)
                        {
                            Platform.Log(LogLevel.Error, e,
                                         "Unexpected error while processing study: {0} on partition {1}.", studyInstanceUid,
                                         partition.Description);
                        }
                    }

                    // Cleanup the directory, if its empty.
                    DirectoryUtility.DeleteIfEmpty(dateDir.FullName);
                }
            }
        }
		/// <summary>
		/// Reprocess a file systems
		/// </summary>
		/// <param name="partition"></param>
		private void ReprocessPartition(ServerPartition partition)
		{
			var engine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
			engine.Load();

			var postArchivalEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyArchived, partition.Key);
			postArchivalEngine.Load();

			var dataAccessEngine = new ServerRulesEngine(ServerRuleApplyTimeEnum.StudyProcessed, partition.Key);
			dataAccessEngine.AddIncludeType(ServerRuleTypeEnum.DataAccess);
			dataAccessEngine.Load();

			var filesystems = FilesystemMonitor.Instance.GetFilesystems();

			foreach (var f in filesystems)
			{
				var partitionDir = Path.Combine(f.Filesystem.FilesystemPath, partition.PartitionFolder);
				var filesystemDir = new DirectoryInfo(partitionDir);
				foreach (DirectoryInfo dateDir in filesystemDir.GetDirectories())
				{
					if (dateDir.FullName.EndsWith("Deleted")
						|| dateDir.FullName.EndsWith(ServerPlatform.ReconcileStorageFolder))
						continue;

					foreach (DirectoryInfo studyDir in dateDir.GetDirectories())
					{
						String studyInstanceUid = studyDir.Name;
						try
						{
							StudyStorageLocation location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid);
							if (location == null)
							{
								foreach (DirectoryInfo seriesDir in studyDir.GetDirectories())
								{
									FileInfo[] sopInstanceFiles = seriesDir.GetFiles("*.dcm");

									DicomFile file = null;
									foreach (FileInfo sopFile in sopInstanceFiles)
									{
										if (!sopFile.FullName.EndsWith(ServerPlatform.DicomFileExtension))
											continue;

										try
										{
											file = new DicomFile(sopFile.FullName);
											file.Load(DicomTags.StudyId, DicomReadOptions.DoNotStorePixelDataInDataSet | DicomReadOptions.Default);
											break;
										}
										catch (Exception e)
										{
											Platform.Log(LogLevel.Warn, e, "Unexpected failure loading file: {0}.  Continuing to next file.",
														 sopFile.FullName);
											file = null;
										}
									}
									if (file != null)
									{
										studyInstanceUid = file.DataSet[DicomTags.StudyInstanceUid].ToString();
										break;
									}
								}

								location = LoadReadableStorageLocation(partition.GetKey(), studyInstanceUid);
								if (location == null)
									continue;
							}

							ProcessStudy(partition, location, engine, postArchivalEngine, dataAccessEngine);
							//_stats.NumStudies++;

							if (CancelPending) return;
						}
						catch (Exception e)
						{
							Platform.Log(LogLevel.Error, e,
										 "Unexpected error while processing study: {0} on partition {1}.", studyInstanceUid,
										 partition.Description);
						}
					}

					// Cleanup the directory, if its empty.
					DirectoryUtility.DeleteIfEmpty(dateDir.FullName);
				}
			}
		}