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