diff OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp @ 2642:ccc470091ea6 jobs

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 28 May 2018 16:46:54 +0200
parents c691fcf66071
children a21b244efb37
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp	Mon May 28 16:39:00 2018 +0200
+++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp	Mon May 28 16:46:54 2018 +0200
@@ -34,10 +34,10 @@
 #include "../PrecompiledHeadersServer.h"
 #include "OrthancRestApi.h"
 
+#include "../../Core/DicomParsing/FromDcmtkBridge.h"
 #include "../../Core/Logging.h"
-#include "../../Core/DicomParsing/FromDcmtkBridge.h"
 #include "../ServerContext.h"
-#include "../OrthancInitialization.h"
+#include "../ServerJobs/ResourceModificationJob.h"
 
 #include <boost/lexical_cast.hpp>
 #include <boost/algorithm/string/predicate.hpp>
@@ -139,287 +139,6 @@
 
 
 
-  class ResourceModificationJob : public SetOfInstancesJob
-  {
-  public:
-    class Output : public boost::noncopyable
-    {
-    private:
-      boost::mutex  mutex_;
-      ResourceType  level_;
-      bool          isFirst_;
-      std::string   id_;
-      std::string   patientId_;
-
-    public:
-      Output(ResourceType  level) :
-        level_(level),
-        isFirst_(true)
-      {
-        if (level_ != ResourceType_Patient &&
-            level_ != ResourceType_Study &&
-            level_ != ResourceType_Series)
-        {
-          throw OrthancException(ErrorCode_ParameterOutOfRange);
-        }            
-      }
-
-      ResourceType GetLevel() const
-      {
-        return level_;
-      }
-
-      void Update(DicomInstanceHasher& hasher)
-      {
-        boost::mutex::scoped_lock lock(mutex_);
-        
-        if (isFirst_)
-        {
-          switch (level_)
-          {
-            case ResourceType_Series:
-              id_ = hasher.HashSeries();
-              break;
-
-            case ResourceType_Study:
-              id_ = hasher.HashStudy();
-              break;
-
-            case ResourceType_Patient:
-              id_ = hasher.HashPatient();
-              break;
-
-            default:
-              throw OrthancException(ErrorCode_InternalError);
-          }
-
-          patientId_ = hasher.HashPatient();
-          isFirst_ = false;
-        }
-      }
-
-      bool Format(Json::Value& target)
-      {
-        boost::mutex::scoped_lock lock(mutex_);
-        
-        if (isFirst_)
-        {
-          return false;
-        }
-        else
-        {
-          target = Json::objectValue;
-          target["Type"] = EnumerationToString(level_);
-          target["ID"] = id_;
-          target["Path"] = GetBasePath(level_, id_);
-          target["PatientID"] = patientId_;
-          return true;
-        }
-      }
-
-      bool GetIdentifier(std::string& id)
-      {
-        boost::mutex::scoped_lock lock(mutex_);
-        
-        if (isFirst_)
-        {
-          return false;
-        }
-        else
-        {
-          id = id_;
-          return true;
-        }
-      }
-    };
-    
-  private:
-    ServerContext&                    context_;
-    std::auto_ptr<DicomModification>  modification_;
-    boost::shared_ptr<Output>         output_;
-    bool                              isAnonymization_;
-    MetadataType                      metadataType_;
-    std::string                       description_;
-    DicomInstanceOrigin               origin_;
-
-  protected:
-    bool HandleInstance(const std::string& instance)
-    {
-      if (modification_.get() == NULL)
-      {
-        LOG(ERROR) << "No modification was provided for this job";
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-
-      
-      LOG(INFO) << "Modifying instance in a job: " << instance;
-
-      std::auto_ptr<ServerContext::DicomCacheLocker> locker;
-
-      try
-      {
-        locker.reset(new ServerContext::DicomCacheLocker(context_, instance));
-      }
-      catch (OrthancException&)
-      {
-        LOG(WARNING) << "An instance was removed after the job was issued: " << instance;
-        return false;
-      }
-
-
-      ParsedDicomFile& original = locker->GetDicom();
-      DicomInstanceHasher originalHasher = original.GetHasher();
-
-
-      /**
-       * Compute the resulting DICOM instance.
-       **/
-
-      std::auto_ptr<ParsedDicomFile> modified(original.Clone(true));
-      modification_->Apply(*modified);
-
-      DicomInstanceToStore toStore;
-      toStore.SetOrigin(origin_);
-      toStore.SetParsedDicomFile(*modified);
-
-
-      /**
-       * Prepare the metadata information to associate with the
-       * resulting DICOM instance (AnonymizedFrom/ModifiedFrom).
-       **/
-
-      DicomInstanceHasher modifiedHasher = modified->GetHasher();
-      
-      MetadataType metadataType = (isAnonymization_ ?
-                                   MetadataType_AnonymizedFrom :
-                                   MetadataType_ModifiedFrom);
-
-      if (originalHasher.HashSeries() != modifiedHasher.HashSeries())
-      {
-        toStore.AddMetadata(ResourceType_Series, metadataType, originalHasher.HashSeries());
-      }
-
-      if (originalHasher.HashStudy() != modifiedHasher.HashStudy())
-      {
-        toStore.AddMetadata(ResourceType_Study, metadataType, originalHasher.HashStudy());
-      }
-
-      if (originalHasher.HashPatient() != modifiedHasher.HashPatient())
-      {
-        toStore.AddMetadata(ResourceType_Patient, metadataType, originalHasher.HashPatient());
-      }
-
-      assert(instance == originalHasher.HashInstance());
-      toStore.AddMetadata(ResourceType_Instance, metadataType, instance);
-
-
-      /**
-       * Store the resulting DICOM instance into the Orthanc store.
-       **/
-
-      std::string modifiedInstance;
-      if (context_.Store(modifiedInstance, toStore) != StoreStatus_Success)
-      {
-        LOG(ERROR) << "Error while storing a modified instance " << instance;
-        throw OrthancException(ErrorCode_CannotStoreInstance);
-      }
-
-      // Sanity checks in debug mode
-      assert(modifiedInstance == modifiedHasher.HashInstance());
-
-
-      if (output_.get() != NULL)
-      {
-        output_->Update(modifiedHasher);
-      }
-
-      return true;
-    }
-    
-  public:
-    ResourceModificationJob(ServerContext& context) :
-      context_(context),
-      isAnonymization_(false)
-    {
-    }
-
-    void SetModification(DicomModification* modification,   // Takes ownership
-                         bool isAnonymization)
-    {
-      if (modification == NULL)
-      {
-        throw OrthancException(ErrorCode_NullPointer);
-      }
-      else if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        modification_.reset(modification);
-        isAnonymization_ = isAnonymization;
-      }
-    }
-
-    void SetOutput(boost::shared_ptr<Output>& output)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        output_ = output;
-      }
-    }
-
-    void SetOrigin(const DicomInstanceOrigin& origin)
-    {
-      if (IsStarted())
-      {
-        throw OrthancException(ErrorCode_BadSequenceOfCalls);
-      }
-      else
-      {
-        origin_ = origin;
-      }
-    }
-
-    void SetOrigin(const RestApiCall& call)
-    {
-      DicomInstanceOrigin tmp;
-      tmp.SetRestOrigin(call);      
-      SetOrigin(tmp);
-    }
-
-    virtual void ReleaseResources()
-    {
-    }
-
-    virtual void GetJobType(std::string& target)
-    {
-      target = "ResourceModification";
-    }
-
-    virtual void GetPublicContent(Json::Value& value)
-    {
-      SetOfInstancesJob::GetPublicContent(value);
-
-      value["IsAnonymization"] = isAnonymization_;
-    }
-    
-    virtual void GetInternalContent(Json::Value& value)
-    {
-      SetOfInstancesJob::GetInternalContent(value);
-
-      Json::Value tmp;
-      modification_->Serialize(tmp);
-      value["Modification"] = tmp;
-    }
-  };
-  
-
-
   static void SubmitJob(std::auto_ptr<DicomModification>& modification,
                         bool isAnonymization,
                         ResourceType level,