comparison OrthancServer/OrthancRestApi/OrthancRestSystem.cpp @ 1232:f1c01451a8ee

Introspection of plugins, Plugins can extend Orthanc Explorer with custom JavaScript
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 04 Dec 2014 17:04:40 +0100
parents efece308018e
children eac00401cb96
comparison
equal deleted inserted replaced
1231:703fcd797186 1232:f1c01451a8ee
33 #include "../PrecompiledHeadersServer.h" 33 #include "../PrecompiledHeadersServer.h"
34 #include "OrthancRestApi.h" 34 #include "OrthancRestApi.h"
35 35
36 #include "../OrthancInitialization.h" 36 #include "../OrthancInitialization.h"
37 #include "../FromDcmtkBridge.h" 37 #include "../FromDcmtkBridge.h"
38 #include "../../Plugins/Engine/PluginsManager.h"
39 #include "../../Plugins/Engine/OrthancPlugins.h"
38 40
39 #include <glog/logging.h> 41 #include <glog/logging.h>
40 42
41 43
42 namespace Orthanc 44 namespace Orthanc
109 static void GetDicomConformanceStatement(RestApiGetCall& call) 111 static void GetDicomConformanceStatement(RestApiGetCall& call)
110 { 112 {
111 std::string statement; 113 std::string statement;
112 GetFileResource(statement, EmbeddedResources::DICOM_CONFORMANCE_STATEMENT); 114 GetFileResource(statement, EmbeddedResources::DICOM_CONFORMANCE_STATEMENT);
113 call.GetOutput().AnswerBuffer(statement, "text/plain"); 115 call.GetOutput().AnswerBuffer(statement, "text/plain");
116 }
117
118
119 // Plugins information ------------------------------------------------------
120
121 static void ListPlugins(RestApiGetCall& call)
122 {
123 Json::Value v = Json::arrayValue;
124
125 if (OrthancRestApi::GetContext(call).HasPlugins())
126 {
127 std::list<std::string> plugins;
128 OrthancRestApi::GetContext(call).GetPluginsManager().ListPlugins(plugins);
129
130 for (std::list<std::string>::const_iterator
131 it = plugins.begin(); it != plugins.end(); it++)
132 {
133 v.append(*it);
134 }
135 }
136
137 call.GetOutput().AnswerJson(v);
138 }
139
140
141 static void GetPlugin(RestApiGetCall& call)
142 {
143 if (!OrthancRestApi::GetContext(call).HasPlugins())
144 {
145 return;
146 }
147
148 const PluginsManager& manager = OrthancRestApi::GetContext(call).GetPluginsManager();
149 std::string id = call.GetUriComponent("id", "");
150
151 if (manager.HasPlugin(id))
152 {
153 Json::Value v = Json::objectValue;
154 v["ID"] = id;
155 v["Version"] = manager.GetPluginVersion(id);
156
157 const OrthancPlugins& plugins = OrthancRestApi::GetContext(call).GetOrthancPlugins();
158 const char *c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_RootUri);
159 if (c != NULL)
160 {
161 v["RootUri"] = c;
162 }
163
164 c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_Description);
165 if (c != NULL)
166 {
167 v["Description"] = c;
168 }
169
170 c = plugins.GetProperty(id.c_str(), _OrthancPluginProperty_OrthancExplorer);
171 v["ExtendsOrthancExplorer"] = (c != NULL);
172
173 call.GetOutput().AnswerJson(v);
174 }
175 }
176
177
178 static void GetOrthancExplorerPlugins(RestApiGetCall& call)
179 {
180 std::string s = "// Extensions to Orthanc Explorer by the registered plugins\n\n";
181
182 if (OrthancRestApi::GetContext(call).HasPlugins())
183 {
184 const PluginsManager& manager = OrthancRestApi::GetContext(call).GetPluginsManager();
185 const OrthancPlugins& plugins = OrthancRestApi::GetContext(call).GetOrthancPlugins();
186
187 std::list<std::string> lst;
188 OrthancRestApi::GetContext(call).GetPluginsManager().ListPlugins(lst);
189
190 for (std::list<std::string>::const_iterator
191 it = lst.begin(); it != lst.end(); it++)
192 {
193 const char* tmp = plugins.GetProperty(it->c_str(), _OrthancPluginProperty_OrthancExplorer);
194 if (tmp != NULL)
195 {
196 s += "/**\n * From plugin: " + *it + " (version " + manager.GetPluginVersion(*it) + ")\n **/\n\n";
197 s += std::string(tmp) + "\n\n";
198 }
199 }
200 }
201
202 call.GetOutput().AnswerBuffer(s, "application/javascript");
114 } 203 }
115 204
116 205
117 void OrthancRestApi::RegisterSystem() 206 void OrthancRestApi::RegisterSystem()
118 { 207 {
121 Register("/statistics", GetStatistics); 210 Register("/statistics", GetStatistics);
122 Register("/tools/generate-uid", GenerateUid); 211 Register("/tools/generate-uid", GenerateUid);
123 Register("/tools/execute-script", ExecuteScript); 212 Register("/tools/execute-script", ExecuteScript);
124 Register("/tools/now", GetNowIsoString); 213 Register("/tools/now", GetNowIsoString);
125 Register("/tools/dicom-conformance", GetDicomConformanceStatement); 214 Register("/tools/dicom-conformance", GetDicomConformanceStatement);
215
216 Register("/plugins", ListPlugins);
217 Register("/plugins/{id}", GetPlugin);
218 Register("/plugins/explorer.js", GetOrthancExplorerPlugins);
126 } 219 }
127 } 220 }