Mercurial > hg > orthanc-dicomweb
changeset 542:0611b666285c
added a list of 'Resources' in the DicomWebStowClient 'Content'
author | Alain Mazy <am@osimis.io> |
---|---|
date | Mon, 10 Oct 2022 13:15:04 +0200 |
parents | e4244b3436ad |
children | b952ff57e48e |
files | NEWS Plugin/DicomWebClient.cpp TODO |
diffstat | 3 files changed, 77 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/NEWS Wed Aug 31 09:43:24 2022 +0200 +++ b/NEWS Mon Oct 10 13:15:04 2022 +0200 @@ -1,3 +1,6 @@ +* Added a list of "Resources" in the DicomWebStowClient "Content" + + Version 1.10 (2022-08-30) =========================
--- a/Plugin/DicomWebClient.cpp Wed Aug 31 09:43:24 2022 +0200 +++ b/Plugin/DicomWebClient.cpp Mon Oct 10 13:15:04 2022 +0200 @@ -57,7 +57,7 @@ } void SetContent(const std::string& key, - const std::string& value) + const Json::Value& value) { that_.SetContent(key, value); } @@ -166,8 +166,16 @@ } } + // void SetContent(const std::string& key, + // const std::string& value) + // { + // boost::mutex::scoped_lock lock(mutex_); + // content_[key] = value; + // UpdateContent(content_); + // } + void SetContent(const std::string& key, - const std::string& value) + const Json::Value& value) { boost::mutex::scoped_lock lock(mutex_); content_[key] = value; @@ -491,8 +499,40 @@ } +// static void AddResourceForJobContent(Json::Value resourcesForJobContent /* out */, const char* resourceType, const std::string& resourceId) +static void AddResourceForJobContent(Json::Value& resourcesForJobContent /* out */, Orthanc::ResourceType resourceType, const std::string& resourceId) +{ + // const char* resourceGroup = "Instances"; + // if (resourceType == "Study") + // { + // resourceGroup = "Studies"; + // } + // else if (resourceType == "Series") + // { + // resourceGroup = "Series"; + // } + // else if (resourceType == "Patient") + // { + // resourceGroup = "Patients"; + // } + // else if (resourceType == "Instance") + // { + // resourceGroup = "Instances"; + // } + const char* resourceGroup = Orthanc::GetResourceTypeText(resourceType, true, true); + + if (!resourcesForJobContent.isMember(resourceGroup)) + { + resourcesForJobContent[resourceGroup] = Json::arrayValue; + } + + resourcesForJobContent[resourceGroup].append(resourceId); +} + + static void ParseStowRequest(std::list<std::string>& instances /* out */, std::map<std::string, std::string>& httpHeaders /* out */, + Json::Value& resourcesForJobContent /* out */, const Json::Value& body /* in */) { static const char* RESOURCES = "Resources"; @@ -528,27 +568,30 @@ } // Test whether this resource is an instance - Json::Value tmp; - if (OrthancPlugins::RestApiGet(tmp, "/instances/" + resource, false)) + Json::Value tmpResource; + Json::Value tmpInstances; + if (OrthancPlugins::RestApiGet(tmpResource, "/instances/" + resource, false)) { - AddInstance(instances, tmp); + AddInstance(instances, tmpResource); + AddResourceForJobContent(resourcesForJobContent, Orthanc::ResourceType_Instance, resource); } // This was not an instance, successively try with series/studies/patients - else if ((OrthancPlugins::RestApiGet(tmp, "/series/" + resource, false) && - OrthancPlugins::RestApiGet(tmp, "/series/" + resource + "/instances", false)) || - (OrthancPlugins::RestApiGet(tmp, "/studies/" + resource, false) && - OrthancPlugins::RestApiGet(tmp, "/studies/" + resource + "/instances", false)) || - (OrthancPlugins::RestApiGet(tmp, "/patients/" + resource, false) && - OrthancPlugins::RestApiGet(tmp, "/patients/" + resource + "/instances", false))) + else if ((OrthancPlugins::RestApiGet(tmpResource, "/series/" + resource, false) && + OrthancPlugins::RestApiGet(tmpInstances, "/series/" + resource + "/instances", false)) || + (OrthancPlugins::RestApiGet(tmpResource, "/studies/" + resource, false) && + OrthancPlugins::RestApiGet(tmpInstances, "/studies/" + resource + "/instances", false)) || + (OrthancPlugins::RestApiGet(tmpResource, "/patients/" + resource, false) && + OrthancPlugins::RestApiGet(tmpInstances, "/patients/" + resource + "/instances", false))) { - if (tmp.type() != Json::arrayValue) + if (tmpInstances.type() != Json::arrayValue) { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } - for (Json::Value::ArrayIndex j = 0; j < tmp.size(); j++) + for (Json::Value::ArrayIndex j = 0; j < tmpInstances.size(); j++) { - AddInstance(instances, tmp[j]); + AddInstance(instances, tmpInstances[j]); + AddResourceForJobContent(resourcesForJobContent, Orthanc::StringToResourceType(tmpResource["Type"].asString().c_str()), resource); } } else @@ -580,6 +623,7 @@ Action action_; size_t networkSize_; bool debug_; + Json::Value resourcesForJobContent_; bool ReadNextInstance(std::string& dicom, JobContext& context) @@ -698,6 +742,7 @@ { boost::mutex::scoped_lock lock(that_.mutex_); context.SetContent("InstancesCount", boost::lexical_cast<std::string>(that_.instances_.size())); + context.SetContent("Resources", that_.GetResourcesForJobContent()); serverName = that_.serverName_; startPosition = that_.position_; @@ -792,14 +837,16 @@ public: StowClientJob(const std::string& serverName, const std::list<std::string>& instances, - const OrthancPlugins::HttpClient::HttpHeaders& headers) : + const OrthancPlugins::HttpClient::HttpHeaders& headers, + const Json::Value& resourcesForJobContent) : SingleFunctionJob("DicomWebStowClient"), serverName_(serverName), headers_(headers), position_(0), action_(Action_None), networkSize_(0), - debug_(false) + debug_(false), + resourcesForJobContent_(resourcesForJobContent) { SetFactory(*this); @@ -835,6 +882,11 @@ { debug_ = debug; } + + const Json::Value& GetResourcesForJobContent() + { + return resourcesForJobContent_; + } }; @@ -863,12 +915,13 @@ std::list<std::string> instances; std::map<std::string, std::string> httpHeaders; - ParseStowRequest(instances, httpHeaders, body); + Json::Value resourcesForJobContent; + ParseStowRequest(instances, httpHeaders, resourcesForJobContent, body); OrthancPlugins::LogInfo("Sending " + boost::lexical_cast<std::string>(instances.size()) + " instances using STOW-RS to DICOMweb server: " + serverName); - std::unique_ptr<StowClientJob> job(new StowClientJob(serverName, instances, httpHeaders)); + std::unique_ptr<StowClientJob> job(new StowClientJob(serverName, instances, httpHeaders, resourcesForJobContent)); bool debug; if (OrthancPlugins::LookupBooleanValue(debug, body, "Debug"))
--- a/TODO Wed Aug 31 09:43:24 2022 +0200 +++ b/TODO Mon Oct 10 13:15:04 2022 +0200 @@ -2,4 +2,6 @@ from https://groups.google.com/d/msgid/orthanc-users/c60227f2-c6da-4fd9-9b03-3ce9bf7d1af5n%40googlegroups.com?utm_medium=email&utm_source=footer * /rendered at study level shall return all instances, not only one (https://groups.google.com/g/orthanc-users/c/uFWanYhV8Fs/m/ezi1iXCXCAAJ) - Check /rendered at series level too. \ No newline at end of file + Check /rendered at series level too. + +* Implement serialization of DicomWeb jobs \ No newline at end of file