diff OrthancServer/OrthancConfiguration.cpp @ 2946:2e751f615e03

new configuration options: DicomModalitiesInDatabase and OrthancPeersInDatabase
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 29 Nov 2018 17:15:29 +0100
parents f395460af74d
children bbfd95a0c429
line wrap: on
line diff
--- a/OrthancServer/OrthancConfiguration.cpp	Thu Nov 29 16:35:18 2018 +0100
+++ b/OrthancServer/OrthancConfiguration.cpp	Thu Nov 29 17:15:29 2018 +0100
@@ -44,8 +44,9 @@
 
 
 static const char* const DICOM_MODALITIES = "DicomModalities";
+static const char* const DICOM_MODALITIES_IN_DB = "DicomModalitiesInDatabase";
 static const char* const ORTHANC_PEERS = "OrthancPeers";
-
+static const char* const ORTHANC_PEERS_IN_DB = "OrthancPeersInDatabase";
 
 namespace Orthanc
 {
@@ -210,20 +211,6 @@
   }
 
 
-  void OrthancConfiguration::SaveModalitiesToJson(Json::Value& target)
-  {
-    target = Json::objectValue;
-
-    for (Modalities::const_iterator it = modalities_.begin(); it != modalities_.end(); ++it)
-    {
-      Json::Value modality;
-      it->second.Serialize(modality, true /* force advanced format */);
-
-      target[it->first] = modality;
-    }
-  }
-
-    
   void OrthancConfiguration::LoadPeersFromJson(const Json::Value& source)
   {
     peers_.clear();
@@ -248,6 +235,101 @@
   }
 
 
+  void OrthancConfiguration::LoadModalities()
+  {
+    if (GetBooleanParameter(DICOM_MODALITIES_IN_DB, false))
+    {
+      // Modalities are stored in the database
+      if (serverIndex_ == NULL)
+      {
+        throw Orthanc::OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        std::string property = serverIndex_->GetGlobalProperty(GlobalProperty_Modalities, "{}");
+
+        Json::Reader reader;
+        Json::Value modalities;
+        if (reader.parse(property, modalities))
+        {
+          LoadModalitiesFromJson(modalities);
+        }
+        else
+        {
+          LOG(ERROR) << "Cannot unserialize the list of modalities from the Orthanc database";
+          throw OrthancException(ErrorCode_InternalError);
+        }
+      }
+    }
+    else
+    {
+      // Modalities are stored in the configuration files
+      if (json_.isMember(DICOM_MODALITIES))
+      {
+        LoadModalitiesFromJson(json_[DICOM_MODALITIES]);
+      }
+      else
+      {
+        modalities_.clear();
+      }
+    }
+  }
+
+  void OrthancConfiguration::LoadPeers()
+  {
+    if (GetBooleanParameter(ORTHANC_PEERS_IN_DB, false))
+    {
+      // Peers are stored in the database
+      if (serverIndex_ == NULL)
+      {
+        throw Orthanc::OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        std::string property = serverIndex_->GetGlobalProperty(GlobalProperty_Peers, "{}");
+
+        Json::Reader reader;
+        Json::Value peers;
+        if (reader.parse(property, peers))
+        {
+          LoadPeersFromJson(peers);
+        }
+        else
+        {
+          LOG(ERROR) << "Cannot unserialize the list of peers from the Orthanc database";
+          throw OrthancException(ErrorCode_InternalError);
+        }
+      }
+    }
+    else
+    {
+      // Peers are stored in the configuration files
+      if (json_.isMember(ORTHANC_PEERS))
+      {
+        LoadPeersFromJson(json_[ORTHANC_PEERS]);
+      }
+      else
+      {
+        peers_.clear();
+      }
+    }
+  }
+
+
+  void OrthancConfiguration::SaveModalitiesToJson(Json::Value& target)
+  {
+    target = Json::objectValue;
+
+    for (Modalities::const_iterator it = modalities_.begin(); it != modalities_.end(); ++it)
+    {
+      Json::Value modality;
+      it->second.Serialize(modality, true /* force advanced format */);
+
+      target[it->first] = modality;
+    }
+  }
+
+    
   void OrthancConfiguration::SavePeersToJson(Json::Value& target)
   {
     target = Json::objectValue;
@@ -264,51 +346,67 @@
   }  
     
     
-  void OrthancConfiguration::LoadModalitiesAndPeers()
+  void OrthancConfiguration::SaveModalities()
   {
-    if (json_.isMember(DICOM_MODALITIES))
+    if (GetBooleanParameter(DICOM_MODALITIES_IN_DB, false))
     {
-      LoadModalitiesFromJson(json_[DICOM_MODALITIES]);
+      // Modalities are stored in the database
+      if (serverIndex_ == NULL)
+      {
+        throw Orthanc::OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        Json::Value modalities;
+        SaveModalitiesToJson(modalities);
+
+        Json::FastWriter writer;
+        std::string s = writer.write(modalities);
+
+        serverIndex_->SetGlobalProperty(GlobalProperty_Modalities, s);
+      }
     }
     else
     {
-      // TODO - Read from DB
-      modalities_.clear();
-    }
-
-    if (json_.isMember(ORTHANC_PEERS))
-    {
-      LoadPeersFromJson(json_[ORTHANC_PEERS]);
-    }
-    else
-    {
-      // TODO - Read from DB
-      peers_.clear();
+      // Modalities are stored in the configuration files
+      if (!modalities_.empty() ||
+          json_.isMember(DICOM_MODALITIES))
+      {
+        SaveModalitiesToJson(json_[DICOM_MODALITIES]);
+      }
     }
   }
 
 
-  void OrthancConfiguration::SaveModalities()
-  {
-    if (!modalities_.empty() ||
-        json_.isMember(DICOM_MODALITIES))
-    {
-      SaveModalitiesToJson(json_[DICOM_MODALITIES]);
-    }
-
-    // TODO - Write to DB
-  }
-
-
   void OrthancConfiguration::SavePeers()
   {
-    if (!peers_.empty() ||
-        json_.isMember(ORTHANC_PEERS))
+    if (GetBooleanParameter(ORTHANC_PEERS_IN_DB, false))
     {
-      SavePeersToJson(json_[ORTHANC_PEERS]);
+      // Peers are stored in the database
+      if (serverIndex_ == NULL)
+      {
+        throw Orthanc::OrthancException(ErrorCode_BadSequenceOfCalls);
+      }
+      else
+      {
+        Json::Value peers;
+        SavePeersToJson(peers);
+
+        Json::FastWriter writer;
+        std::string s = writer.write(peers);
+
+        serverIndex_->SetGlobalProperty(GlobalProperty_Peers, s);
+      }
     }
-
-    // TODO - Write to DB
+    else
+    {
+      // Peers are stored in the configuration files
+      if (!peers_.empty() ||
+          json_.isMember(ORTHANC_PEERS))
+      {
+        SavePeersToJson(json_[ORTHANC_PEERS]);
+      }
+    }
   }
 
 
@@ -439,8 +537,13 @@
       configurationAbsolutePath_ = boost::filesystem::absolute(p).string();
 #endif
     }
+  }
 
-    LoadModalitiesAndPeers();
+
+  void OrthancConfiguration::LoadModalitiesAndPeers()
+  {
+    LoadModalities();
+    LoadPeers();
   }