comparison OrthancServer/LuaScripting.cpp @ 1447:5ba7471780ae

refactoring: HttpToolbox, DumpJson in Lua
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 01 Jul 2015 17:42:06 +0200
parents d26c8a93d05a
children 164a381abb2b
comparison
equal deleted inserted replaced
1446:8dc80ba768aa 1447:5ba7471780ae
56 const void* value = LuaContext::GetGlobalVariable(state, "_ServerContext"); 56 const void* value = LuaContext::GetGlobalVariable(state, "_ServerContext");
57 return const_cast<ServerContext*>(reinterpret_cast<const ServerContext*>(value)); 57 return const_cast<ServerContext*>(reinterpret_cast<const ServerContext*>(value));
58 } 58 }
59 59
60 60
61 // Syntax in Lua: RestApiGet(uri, builtin)
61 int LuaScripting::RestApiGet(lua_State *state) 62 int LuaScripting::RestApiGet(lua_State *state)
62 { 63 {
63 ServerContext* serverContext = GetServerContext(state); 64 ServerContext* serverContext = GetServerContext(state);
64 if (serverContext == NULL) 65 if (serverContext == NULL)
65 { 66 {
87 { 88 {
88 lua_pushstring(state, result.c_str()); 89 lua_pushstring(state, result.c_str());
89 } 90 }
90 else 91 else
91 { 92 {
92 LOG(ERROR) << "Lua: Error in RestApiGet() for URI " << uri; 93 LOG(ERROR) << "Lua: Error in RestApiGet() for URI: " << uri;
94 lua_pushnil(state);
95 }
96
97 return 1;
98 }
99
100
101 int LuaScripting::RestApiPostOrPut(lua_State *state,
102 bool isPost)
103 {
104 ServerContext* serverContext = GetServerContext(state);
105 if (serverContext == NULL)
106 {
107 LOG(ERROR) << "Lua: The Orthanc API is unavailable";
108 lua_pushnil(state);
109 return 1;
110 }
111
112 // Check the types of the arguments
113 int nArgs = lua_gettop(state);
114 if ((nArgs != 2 && nArgs != 3) ||
115 !lua_isstring(state, 1) || // URI
116 !lua_isstring(state, 2) || // Body
117 (nArgs == 3 && !lua_isboolean(state, 3))) // Restrict to built-in API?
118 {
119 LOG(ERROR) << "Lua: Bad parameters to " << (isPost ? "RestApiPost()" : "RestApiPut()");
120 lua_pushnil(state);
121 return 1;
122 }
123
124 const char* uri = lua_tostring(state, 1);
125 size_t bodySize = 0;
126 const char* bodyData = lua_tolstring(state, 2, &bodySize);
127 bool builtin = (nArgs == 3 ? lua_toboolean(state, 3) : false);
128
129 std::string result;
130 if (isPost ?
131 HttpToolbox::SimplePost(result, serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin),
132 uri, bodyData, bodySize) :
133 HttpToolbox::SimplePut(result, serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin),
134 uri, bodyData, bodySize))
135 {
136 lua_pushstring(state, result.c_str());
137 }
138 else
139 {
140 LOG(ERROR) << "Lua: Error in " << (isPost ? "RestApiPost()" : "RestApiPut()") << " for URI: " << uri;
141 lua_pushnil(state);
142 }
143
144 return 1;
145 }
146
147
148 // Syntax in Lua: RestApiPost(uri, body, builtin)
149 int LuaScripting::RestApiPost(lua_State *state)
150 {
151 return RestApiPostOrPut(state, true);
152 }
153
154
155 // Syntax in Lua: RestApiPut(uri, body, builtin)
156 int LuaScripting::RestApiPut(lua_State *state)
157 {
158 return RestApiPostOrPut(state, false);
159 }
160
161
162 // Syntax in Lua: RestApiDelete(uri, builtin)
163 int LuaScripting::RestApiDelete(lua_State *state)
164 {
165 ServerContext* serverContext = GetServerContext(state);
166 if (serverContext == NULL)
167 {
168 LOG(ERROR) << "Lua: The Orthanc API is unavailable";
169 lua_pushnil(state);
170 return 1;
171 }
172
173 // Check the types of the arguments
174 int nArgs = lua_gettop(state);
175 if ((nArgs != 1 && nArgs != 2) ||
176 !lua_isstring(state, 1) || // URI
177 (nArgs == 2 && !lua_isboolean(state, 2))) // Restrict to built-in API?
178 {
179 LOG(ERROR) << "Lua: Bad parameters to RestApiGet()";
180 lua_pushnil(state);
181 return 1;
182 }
183
184 const char* uri = lua_tostring(state, 1);
185 bool builtin = (nArgs == 2 ? lua_toboolean(state, 2) : false);
186
187 if (HttpToolbox::SimpleDelete(serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin), uri))
188 {
189 lua_pushboolean(state, 1);
190 }
191 else
192 {
193 LOG(ERROR) << "Lua: Error in RestApiGet() for URI: " << uri;
93 lua_pushnil(state); 194 lua_pushnil(state);
94 } 195 }
95 196
96 return 1; 197 return 1;
97 } 198 }
249 350
250 LuaScripting::LuaScripting(ServerContext& context) : context_(context) 351 LuaScripting::LuaScripting(ServerContext& context) : context_(context)
251 { 352 {
252 lua_.SetGlobalVariable("_ServerContext", &context); 353 lua_.SetGlobalVariable("_ServerContext", &context);
253 lua_.RegisterFunction("RestApiGet", RestApiGet); 354 lua_.RegisterFunction("RestApiGet", RestApiGet);
355 lua_.RegisterFunction("RestApiPost", RestApiPost);
356 lua_.RegisterFunction("RestApiPut", RestApiPut);
357 lua_.RegisterFunction("RestApiDelete", RestApiDelete);
254 358
255 lua_.Execute(Orthanc::EmbeddedResources::LUA_TOOLBOX); 359 lua_.Execute(Orthanc::EmbeddedResources::LUA_TOOLBOX);
256 lua_.SetHttpProxy(Configuration::GetGlobalStringParameter("HttpProxy", "")); 360 lua_.SetHttpProxy(Configuration::GetGlobalStringParameter("HttpProxy", ""));
257 } 361 }
258 362
327 default: 431 default:
328 throw OrthancException(ErrorCode_InternalError); 432 throw OrthancException(ErrorCode_InternalError);
329 } 433 }
330 434
331 435
332 Json::Value tags; 436 Json::Value tags, metadata;
333 if (context_.GetIndex().LookupResource(tags, change.GetPublicId(), change.GetResourceType())) 437 if (context_.GetIndex().LookupResource(tags, change.GetPublicId(), change.GetResourceType()) &&
438 context_.GetIndex().GetMetadata(metadata, change.GetPublicId()))
334 { 439 {
335 boost::mutex::scoped_lock lock(mutex_); 440 boost::mutex::scoped_lock lock(mutex_);
336 441
337 if (lua_.IsExistingFunction(name)) 442 if (lua_.IsExistingFunction(name))
338 { 443 {
339 InitializeJob(); 444 InitializeJob();
340 445
341 LuaFunctionCall call(lua_, name); 446 LuaFunctionCall call(lua_, name);
342 call.PushString(change.GetPublicId()); 447 call.PushString(change.GetPublicId());
343 call.PushJson(tags["MainDicomTags"]); 448 call.PushJson(tags["MainDicomTags"]);
449 call.PushJson(metadata);
344 call.Execute(); 450 call.Execute();
345 451
346 SubmitJob(std::string("Lua script: ") + name); 452 SubmitJob(std::string("Lua script: ") + name);
347 } 453 }
348 } 454 }