comparison OrthancServer/OrthancRestApi/OrthancRestModalities.cpp @ 2940:4767d36679ed

refactoring access to Orthanc configuration
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 29 Nov 2018 11:47:00 +0100
parents 9d277f8ad698
children f395460af74d
comparison
equal deleted inserted replaced
2939:577786f59252 2940:4767d36679ed
35 #include "OrthancRestApi.h" 35 #include "OrthancRestApi.h"
36 36
37 #include "../../Core/DicomParsing/FromDcmtkBridge.h" 37 #include "../../Core/DicomParsing/FromDcmtkBridge.h"
38 #include "../../Core/Logging.h" 38 #include "../../Core/Logging.h"
39 #include "../../Core/SerializationToolbox.h" 39 #include "../../Core/SerializationToolbox.h"
40 #include "../OrthancInitialization.h" 40 #include "../OrthancConfiguration.h"
41 #include "../QueryRetrieveHandler.h" 41 #include "../QueryRetrieveHandler.h"
42 #include "../ServerJobs/DicomModalityStoreJob.h" 42 #include "../ServerJobs/DicomModalityStoreJob.h"
43 #include "../ServerJobs/DicomMoveScuJob.h" 43 #include "../ServerJobs/DicomMoveScuJob.h"
44 #include "../ServerJobs/OrthancPeerStoreJob.h" 44 #include "../ServerJobs/OrthancPeerStoreJob.h"
45 #include "../ServerToolbox.h" 45 #include "../ServerToolbox.h"
46 46
47 47
48 namespace Orthanc 48 namespace Orthanc
49 { 49 {
50 static RemoteModalityParameters MyGetModalityUsingSymbolicName(const std::string& name)
51 {
52 OrthancConfiguration::ReaderLock lock;
53 return lock.GetConfiguration().GetModalityUsingSymbolicName(name);
54 }
55
56
50 /*************************************************************************** 57 /***************************************************************************
51 * DICOM C-Echo SCU 58 * DICOM C-Echo SCU
52 ***************************************************************************/ 59 ***************************************************************************/
53 60
54 static void DicomEcho(RestApiPostCall& call) 61 static void DicomEcho(RestApiPostCall& call)
55 { 62 {
56 ServerContext& context = OrthancRestApi::GetContext(call); 63 ServerContext& context = OrthancRestApi::GetContext(call);
57 64
58 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 65 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
59 RemoteModalityParameters remote = 66 RemoteModalityParameters remote =
60 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 67 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
61 68
62 try 69 try
63 { 70 {
64 DicomUserConnection connection(localAet, remote); 71 DicomUserConnection connection(localAet, remote);
65 connection.Open(); 72 connection.Open();
179 return; 186 return;
180 } 187 }
181 188
182 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 189 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
183 RemoteModalityParameters remote = 190 RemoteModalityParameters remote =
184 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 191 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
185 192
186 DicomFindAnswers answers(false); 193 DicomFindAnswers answers(false);
187 194
188 { 195 {
189 DicomUserConnection connection(localAet, remote); 196 DicomUserConnection connection(localAet, remote);
214 return; 221 return;
215 } 222 }
216 223
217 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 224 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
218 RemoteModalityParameters remote = 225 RemoteModalityParameters remote =
219 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 226 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
220 227
221 DicomFindAnswers answers(false); 228 DicomFindAnswers answers(false);
222 229
223 { 230 {
224 DicomUserConnection connection(localAet, remote); 231 DicomUserConnection connection(localAet, remote);
250 return; 257 return;
251 } 258 }
252 259
253 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 260 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
254 RemoteModalityParameters remote = 261 RemoteModalityParameters remote =
255 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 262 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
256 263
257 DicomFindAnswers answers(false); 264 DicomFindAnswers answers(false);
258 265
259 { 266 {
260 DicomUserConnection connection(localAet, remote); 267 DicomUserConnection connection(localAet, remote);
287 return; 294 return;
288 } 295 }
289 296
290 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 297 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
291 RemoteModalityParameters remote = 298 RemoteModalityParameters remote =
292 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 299 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
293 300
294 DicomFindAnswers answers(false); 301 DicomFindAnswers answers(false);
295 302
296 { 303 {
297 DicomUserConnection connection(localAet, remote); 304 DicomUserConnection connection(localAet, remote);
329 return; 336 return;
330 } 337 }
331 338
332 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 339 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
333 RemoteModalityParameters remote = 340 RemoteModalityParameters remote =
334 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 341 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
335 342
336 DicomUserConnection connection(localAet, remote); 343 DicomUserConnection connection(localAet, remote);
337 connection.Open(); 344 connection.Open();
338 345
339 DicomFindAnswers patients(false); 346 DicomFindAnswers patients(false);
694 { 701 {
695 otherArguments[members[i]] = request[members[i]]; 702 otherArguments[members[i]] = request[members[i]];
696 } 703 }
697 } 704 }
698 705
706 bool logExportedResources;
707
708 {
709 OrthancConfiguration::ReaderLock lock;
710 logExportedResources = lock.GetConfiguration().GetBooleanParameter("LogExportedResources", false);
711 }
712
699 for (Json::Value::ArrayIndex i = 0; i < resources->size(); i++) 713 for (Json::Value::ArrayIndex i = 0; i < resources->size(); i++)
700 { 714 {
701 if (!(*resources) [i].isString()) 715 if (!(*resources) [i].isString())
702 { 716 {
703 return false; 717 return false;
707 if (!Toolbox::IsSHA1(stripped)) 721 if (!Toolbox::IsSHA1(stripped))
708 { 722 {
709 return false; 723 return false;
710 } 724 }
711 725
712 if (Configuration::GetGlobalBoolParameter("LogExportedResources", false)) 726 if (logExportedResources)
713 { 727 {
714 context.GetIndex().LogExportedResource(stripped, remote); 728 context.GetIndex().LogExportedResource(stripped, remote);
715 } 729 }
716 730
717 context.AddChildInstances(job, stripped); 731 context.AddChildInstances(job, stripped);
738 (request, "MoveOriginatorAet", context.GetDefaultLocalApplicationEntityTitle()); 752 (request, "MoveOriginatorAet", context.GetDefaultLocalApplicationEntityTitle());
739 int moveOriginatorID = Toolbox::GetJsonIntegerField 753 int moveOriginatorID = Toolbox::GetJsonIntegerField
740 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */); 754 (request, "MoveOriginatorID", 0 /* By default, not a C-MOVE */);
741 755
742 job->SetLocalAet(localAet); 756 job->SetLocalAet(localAet);
743 job->SetRemoteModality(Configuration::GetModalityUsingSymbolicName(remote)); 757 job->SetRemoteModality(MyGetModalityUsingSymbolicName(remote));
744 758
745 if (moveOriginatorID != 0) 759 if (moveOriginatorID != 0)
746 { 760 {
747 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID); 761 job->SetMoveOriginator(moveOriginatorAET, moveOriginatorID);
748 } 762 }
782 (request, "LocalAet", context.GetDefaultLocalApplicationEntityTitle()); 796 (request, "LocalAet", context.GetDefaultLocalApplicationEntityTitle());
783 std::string targetAet = Toolbox::GetJsonStringField 797 std::string targetAet = Toolbox::GetJsonStringField
784 (request, "TargetAet", context.GetDefaultLocalApplicationEntityTitle()); 798 (request, "TargetAet", context.GetDefaultLocalApplicationEntityTitle());
785 799
786 const RemoteModalityParameters source = 800 const RemoteModalityParameters source =
787 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 801 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
788 802
789 DicomUserConnection connection(localAet, source); 803 DicomUserConnection connection(localAet, source);
790 connection.Open(); 804 connection.Open();
791 805
792 for (Json::Value::ArrayIndex i = 0; i < request[RESOURCES].size(); i++) 806 for (Json::Value::ArrayIndex i = 0; i < request[RESOURCES].size(); i++)
813 return peers.find(id) != peers.end(); 827 return peers.find(id) != peers.end();
814 } 828 }
815 829
816 static void ListPeers(RestApiGetCall& call) 830 static void ListPeers(RestApiGetCall& call)
817 { 831 {
832 OrthancConfiguration::ReaderLock lock;
833
818 OrthancRestApi::SetOfStrings peers; 834 OrthancRestApi::SetOfStrings peers;
819 Configuration::GetListOfOrthancPeers(peers); 835 lock.GetConfiguration().GetListOfOrthancPeers(peers);
820 836
821 if (call.HasArgument("expand")) 837 if (call.HasArgument("expand"))
822 { 838 {
823 Json::Value result = Json::objectValue; 839 Json::Value result = Json::objectValue;
824 for (OrthancRestApi::SetOfStrings::const_iterator 840 for (OrthancRestApi::SetOfStrings::const_iterator
825 it = peers.begin(); it != peers.end(); ++it) 841 it = peers.begin(); it != peers.end(); ++it)
826 { 842 {
827 WebServiceParameters peer; 843 WebServiceParameters peer;
828 844
829 if (Configuration::GetOrthancPeer(peer, *it)) 845 if (lock.GetConfiguration().GetOrthancPeer(peer, *it))
830 { 846 {
831 Json::Value jsonPeer = Json::objectValue; 847 Json::Value jsonPeer = Json::objectValue;
832 // only return the minimum information to identify the 848 // only return the minimum information to identify the
833 // destination, do not include "security" information like 849 // destination, do not include "security" information like
834 // passwords 850 // passwords
855 } 871 }
856 } 872 }
857 873
858 static void ListPeerOperations(RestApiGetCall& call) 874 static void ListPeerOperations(RestApiGetCall& call)
859 { 875 {
876 OrthancConfiguration::ReaderLock lock;
877
860 OrthancRestApi::SetOfStrings peers; 878 OrthancRestApi::SetOfStrings peers;
861 Configuration::GetListOfOrthancPeers(peers); 879 lock.GetConfiguration().GetListOfOrthancPeers(peers);
862 880
863 std::string id = call.GetUriComponent("id", ""); 881 std::string id = call.GetUriComponent("id", "");
864 if (IsExistingPeer(peers, id)) 882 if (IsExistingPeer(peers, id))
865 { 883 {
866 RestApi::AutoListChildren(call); 884 RestApi::AutoListChildren(call);
876 Json::Value request; 894 Json::Value request;
877 std::auto_ptr<OrthancPeerStoreJob> job(new OrthancPeerStoreJob(context)); 895 std::auto_ptr<OrthancPeerStoreJob> job(new OrthancPeerStoreJob(context));
878 896
879 if (GetInstancesToExport(request, *job, remote, call)) 897 if (GetInstancesToExport(request, *job, remote, call))
880 { 898 {
899 OrthancConfiguration::ReaderLock lock;
900
881 WebServiceParameters peer; 901 WebServiceParameters peer;
882 if (Configuration::GetOrthancPeer(peer, remote)) 902 if (lock.GetConfiguration().GetOrthancPeer(peer, remote))
883 { 903 {
884 job->SetPeer(peer); 904 job->SetPeer(peer);
885 OrthancRestApi::GetApi(call).SubmitCommandsJob 905 OrthancRestApi::GetApi(call).SubmitCommandsJob
886 (call, job.release(), true /* synchronous by default */, request); 906 (call, job.release(), true /* synchronous by default */, request);
887 } 907 }
902 return modalities.find(id) != modalities.end(); 922 return modalities.find(id) != modalities.end();
903 } 923 }
904 924
905 static void ListModalities(RestApiGetCall& call) 925 static void ListModalities(RestApiGetCall& call)
906 { 926 {
927 OrthancConfiguration::ReaderLock lock;
928
907 OrthancRestApi::SetOfStrings modalities; 929 OrthancRestApi::SetOfStrings modalities;
908 Configuration::GetListOfDicomModalities(modalities); 930 lock.GetConfiguration().GetListOfDicomModalities(modalities);
909 931
910 if (call.HasArgument("expand")) 932 if (call.HasArgument("expand"))
911 { 933 {
912 Json::Value result = Json::objectValue; 934 Json::Value result = Json::objectValue;
913 for (OrthancRestApi::SetOfStrings::const_iterator 935 for (OrthancRestApi::SetOfStrings::const_iterator
914 it = modalities.begin(); it != modalities.end(); ++it) 936 it = modalities.begin(); it != modalities.end(); ++it)
915 { 937 {
916 const RemoteModalityParameters& remote = Configuration::GetModalityUsingSymbolicName(*it); 938 const RemoteModalityParameters& remote = lock.GetConfiguration().GetModalityUsingSymbolicName(*it);
917 939
918 Json::Value info; 940 Json::Value info;
919 remote.Serialize(info, true /* force advanced format */); 941 remote.Serialize(info, true /* force advanced format */);
920 result[*it] = info; 942 result[*it] = info;
921 } 943 }
934 } 956 }
935 957
936 958
937 static void ListModalityOperations(RestApiGetCall& call) 959 static void ListModalityOperations(RestApiGetCall& call)
938 { 960 {
961 OrthancConfiguration::ReaderLock lock;
962
939 OrthancRestApi::SetOfStrings modalities; 963 OrthancRestApi::SetOfStrings modalities;
940 Configuration::GetListOfDicomModalities(modalities); 964 lock.GetConfiguration().GetListOfDicomModalities(modalities);
941 965
942 std::string id = call.GetUriComponent("id", ""); 966 std::string id = call.GetUriComponent("id", "");
943 if (IsExistingModality(modalities, id)) 967 if (IsExistingModality(modalities, id))
944 { 968 {
945 RestApi::AutoListChildren(call); 969 RestApi::AutoListChildren(call);
955 Json::Reader reader; 979 Json::Reader reader;
956 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) 980 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json))
957 { 981 {
958 RemoteModalityParameters modality; 982 RemoteModalityParameters modality;
959 modality.Unserialize(json); 983 modality.Unserialize(json);
960 Configuration::UpdateModality(context, call.GetUriComponent("id", ""), modality); 984
985 {
986 OrthancConfiguration::WriterLock lock;
987 lock.GetConfiguration().UpdateModality(call.GetUriComponent("id", ""), modality);
988 }
989
990 context.SignalUpdatedModalities();
991
961 call.GetOutput().AnswerBuffer("", MimeType_PlainText); 992 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
962 } 993 }
963 } 994 }
964 995
965 996
966 static void DeleteModality(RestApiDeleteCall& call) 997 static void DeleteModality(RestApiDeleteCall& call)
967 { 998 {
968 ServerContext& context = OrthancRestApi::GetContext(call); 999 ServerContext& context = OrthancRestApi::GetContext(call);
969 1000
970 Configuration::RemoveModality(context, call.GetUriComponent("id", "")); 1001 {
1002 OrthancConfiguration::WriterLock lock;
1003 lock.GetConfiguration().RemoveModality(call.GetUriComponent("id", ""));
1004 }
1005
1006 context.SignalUpdatedModalities();
1007
971 call.GetOutput().AnswerBuffer("", MimeType_PlainText); 1008 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
972 } 1009 }
973 1010
974 1011
975 static void UpdatePeer(RestApiPutCall& call) 1012 static void UpdatePeer(RestApiPutCall& call)
980 Json::Reader reader; 1017 Json::Reader reader;
981 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json)) 1018 if (reader.parse(call.GetBodyData(), call.GetBodyData() + call.GetBodySize(), json))
982 { 1019 {
983 WebServiceParameters peer; 1020 WebServiceParameters peer;
984 peer.Unserialize(json); 1021 peer.Unserialize(json);
985 Configuration::UpdatePeer(context, call.GetUriComponent("id", ""), peer); 1022
1023 {
1024 OrthancConfiguration::WriterLock lock;
1025 lock.GetConfiguration().UpdatePeer(call.GetUriComponent("id", ""), peer);
1026 }
1027
1028 context.SignalUpdatedPeers();
1029
986 call.GetOutput().AnswerBuffer("", MimeType_PlainText); 1030 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
987 } 1031 }
988 } 1032 }
989 1033
990 1034
991 static void DeletePeer(RestApiDeleteCall& call) 1035 static void DeletePeer(RestApiDeleteCall& call)
992 { 1036 {
993 ServerContext& context = OrthancRestApi::GetContext(call); 1037 ServerContext& context = OrthancRestApi::GetContext(call);
994 1038
995 Configuration::RemovePeer(context, call.GetUriComponent("id", "")); 1039 {
1040 OrthancConfiguration::WriterLock lock;
1041 lock.GetConfiguration().RemovePeer(call.GetUriComponent("id", ""));
1042 }
1043
1044 context.SignalUpdatedPeers();
1045
996 call.GetOutput().AnswerBuffer("", MimeType_PlainText); 1046 call.GetOutput().AnswerBuffer("", MimeType_PlainText);
997 } 1047 }
998 1048
999 1049
1000 static void DicomFindWorklist(RestApiPostCall& call) 1050 static void DicomFindWorklist(RestApiPostCall& call)
1004 Json::Value json; 1054 Json::Value json;
1005 if (call.ParseJsonRequest(json)) 1055 if (call.ParseJsonRequest(json))
1006 { 1056 {
1007 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle(); 1057 const std::string& localAet = context.GetDefaultLocalApplicationEntityTitle();
1008 RemoteModalityParameters remote = 1058 RemoteModalityParameters remote =
1009 Configuration::GetModalityUsingSymbolicName(call.GetUriComponent("id", "")); 1059 MyGetModalityUsingSymbolicName(call.GetUriComponent("id", ""));
1010 1060
1011 std::auto_ptr<ParsedDicomFile> query(ParsedDicomFile::CreateFromJson(json, static_cast<DicomFromJsonFlags>(0))); 1061 std::auto_ptr<ParsedDicomFile> query(ParsedDicomFile::CreateFromJson(json, static_cast<DicomFromJsonFlags>(0)));
1012 1062
1013 DicomFindAnswers answers(true); 1063 DicomFindAnswers answers(true);
1014 1064