diff OrthancServer/ServerJobs/SplitStudyJob.cpp @ 2846:d386abc18133

simplification in SplitStudyJob, fix possible memory leak
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 28 Sep 2018 18:36:20 +0200
parents 218e2c864d1d
children 2da68edacab6
line wrap: on
line diff
--- a/OrthancServer/ServerJobs/SplitStudyJob.cpp	Fri Sep 28 17:59:44 2018 +0200
+++ b/OrthancServer/ServerJobs/SplitStudyJob.cpp	Fri Sep 28 18:36:20 2018 +0200
@@ -85,25 +85,16 @@
     /**
      * Chose the target UIDs
      **/
-    
-    std::string series;
-    if (!modified->GetTagValue(series, DICOM_TAG_SERIES_INSTANCE_UID))
+
+    assert(modified->GetHasher().HashStudy() == sourceStudy_);
+
+    std::string series = modified->GetHasher().HashSeries();
+
+    SeriesUidMap::const_iterator targetSeriesUid = seriesUidMap_.find(series);
+
+    if (targetSeriesUid == seriesUidMap_.end())
     {
       throw OrthancException(ErrorCode_BadFileFormat);  // Should never happen
-    }    
-
-    std::string targetSeriesUid;
-    SeriesUidMap::const_iterator found = targetSeries_.find(series);
-
-    if (found == targetSeries_.end())
-    {
-      // Choose a random SeriesInstanceUID for this series
-      targetSeriesUid = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
-      targetSeries_[series] = targetSeriesUid;
-    }
-    else
-    {
-      targetSeriesUid = found->second;
     }
 
 
@@ -129,7 +120,7 @@
      **/
     
     modified->ReplacePlainString(DICOM_TAG_STUDY_INSTANCE_UID, targetStudyUid_);
-    modified->ReplacePlainString(DICOM_TAG_SERIES_INSTANCE_UID, targetSeriesUid);
+    modified->ReplacePlainString(DICOM_TAG_SERIES_INSTANCE_UID, targetSeriesUid->second);
 
     if (targetStudy_.empty())
     {
@@ -186,15 +177,6 @@
       LOG(ERROR) << "Cannot split unknown study: " << sourceStudy;
       throw OrthancException(ErrorCode_UnknownResource);
     }
-
-    std::list<std::string> children;
-    context_.GetIndex().GetChildren(children, sourceStudy);
-
-    for (std::list<std::string>::const_iterator
-           it = children.begin(); it != children.end(); ++it)
-    {
-      sourceSeries_.insert(*it);
-    }
   }
   
 
@@ -219,17 +201,23 @@
 
   void SplitStudyJob::AddSourceSeries(const std::string& series)
   {
+    std::string parent;
+
     if (IsStarted())
     {
       throw OrthancException(ErrorCode_BadSequenceOfCalls);
     }
-    else if (sourceSeries_.find(series) == sourceSeries_.end())
+    else if (!context_.GetIndex().LookupParent(parent, series, ResourceType_Study) ||
+             parent != sourceStudy_)
     {
       LOG(ERROR) << "This series does not belong to the study to be split: " << series;
       throw OrthancException(ErrorCode_UnknownResource);
     }
     else
     {
+      // Generate a target SeriesInstanceUID for this series
+      seriesUidMap_[series] = FromDcmtkBridge::GenerateUniqueIdentifier(ResourceType_Series);
+
       // Add all the instances of the series as to be processed
       std::list<std::string> instances;
       context_.GetIndex().GetChildren(instances, series);
@@ -292,12 +280,11 @@
   }
 
 
+  static const char* KEEP_SOURCE = "KeepSource";
   static const char* SOURCE_STUDY = "SourceStudy";
-  static const char* SOURCE_SERIES = "SourceSeries";
-  static const char* KEEP_SOURCE = "KeepSource";
   static const char* TARGET_STUDY = "TargetStudy";
   static const char* TARGET_STUDY_UID = "TargetStudyUID";
-  static const char* TARGET_SERIES = "TargetSeries";
+  static const char* SERIES_UID_MAP = "SeriesUIDMap";
   static const char* ORIGIN = "Origin";
   static const char* REPLACEMENTS = "Replacements";
   static const char* REMOVALS = "Removals";
@@ -318,10 +305,9 @@
 
     keepSource_ = SerializationToolbox::ReadBoolean(serialized, KEEP_SOURCE);
     sourceStudy_ = SerializationToolbox::ReadString(serialized, SOURCE_STUDY);
-    SerializationToolbox::ReadSetOfStrings(sourceSeries_, serialized, SOURCE_SERIES);
     targetStudy_ = SerializationToolbox::ReadString(serialized, TARGET_STUDY);
     targetStudyUid_ = SerializationToolbox::ReadString(serialized, TARGET_STUDY_UID);
-    SerializationToolbox::ReadMapOfStrings(targetSeries_, serialized, TARGET_SERIES);
+    SerializationToolbox::ReadMapOfStrings(seriesUidMap_, serialized, SERIES_UID_MAP);
     origin_ = DicomInstanceOrigin(serialized[ORIGIN]);
     SerializationToolbox::ReadMapOfTags(replacements_, serialized, REPLACEMENTS);
     SerializationToolbox::ReadSetOfTags(removals_, serialized, REMOVALS);
@@ -338,10 +324,9 @@
     {
       target[KEEP_SOURCE] = keepSource_;
       target[SOURCE_STUDY] = sourceStudy_;
-      SerializationToolbox::WriteSetOfStrings(target, sourceSeries_, SOURCE_SERIES);
       target[TARGET_STUDY] = targetStudy_;
       target[TARGET_STUDY_UID] = targetStudyUid_;
-      SerializationToolbox::WriteMapOfStrings(target, targetSeries_, TARGET_SERIES);
+      SerializationToolbox::WriteMapOfStrings(target, seriesUidMap_, SERIES_UID_MAP);
       origin_.Serialize(target[ORIGIN]);
       SerializationToolbox::WriteMapOfTags(target, replacements_, REPLACEMENTS);
       SerializationToolbox::WriteSetOfTags(target, removals_, REMOVALS);