Mercurial > hg > orthanc
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,