changeset 1008:187ed107a59f lua-scripting

modify command
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 08 Jul 2014 18:14:24 +0200
parents 871c49c9b11d
children 26642cecd36d
files CMakeLists.txt OrthancServer/Scheduler/ModifyInstanceCommand.cpp OrthancServer/Scheduler/ModifyInstanceCommand.h OrthancServer/ServerContext.cpp Resources/Samples/Lua/Autorouting.lua
diffstat 5 files changed, 181 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Tue Jul 08 17:35:00 2014 +0200
+++ b/CMakeLists.txt	Tue Jul 08 18:14:24 2014 +0200
@@ -156,11 +156,12 @@
   # From "lua-scripting" branch
   OrthancServer/DicomInstanceToStore.cpp
   OrthancServer/Scheduler/DeleteInstanceCommand.cpp
+  OrthancServer/Scheduler/ModifyInstanceCommand.cpp
   OrthancServer/Scheduler/ServerCommandInstance.cpp
   OrthancServer/Scheduler/ServerJob.cpp
   OrthancServer/Scheduler/ServerScheduler.cpp
+  OrthancServer/Scheduler/StorePeerCommand.cpp
   OrthancServer/Scheduler/StoreScuCommand.cpp
-  OrthancServer/Scheduler/StorePeerCommand.cpp
   )
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancServer/Scheduler/ModifyInstanceCommand.cpp	Tue Jul 08 18:14:24 2014 +0200
@@ -0,0 +1,69 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "ModifyInstanceCommand.h"
+
+#include <glog/logging.h>
+
+namespace Orthanc
+{
+  bool ModifyInstanceCommand::Apply(ListOfStrings& outputs,
+                                    const ListOfStrings& inputs)
+  {
+    for (ListOfStrings::const_iterator
+           it = inputs.begin(); it != inputs.end(); ++it)
+    {
+      LOG(INFO) << "Modifying resource " << *it;
+
+      std::auto_ptr<ParsedDicomFile> modified;
+
+      {
+        ServerContext::DicomCacheLocker lock(context_, *it);
+        modified.reset(lock.GetDicom().Clone());
+      }
+
+      modification_.Apply(*modified);
+
+      DicomInstanceToStore toStore;
+      toStore.SetParsedDicomFile(*modified);
+      // TODO other metadata
+      toStore.AddMetadata(ResourceType_Instance, MetadataType_ModifiedFrom, *it);
+
+      std::string modifiedId;
+      context_.Store(modifiedId, toStore);
+
+      outputs.push_back(modifiedId);
+    }
+
+    return true;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancServer/Scheduler/ModifyInstanceCommand.h	Tue Jul 08 18:14:24 2014 +0200
@@ -0,0 +1,71 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2014 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "IServerCommand.h"
+#include "../ServerContext.h"
+#include "../DicomModification.h"
+
+namespace Orthanc
+{
+  class ModifyInstanceCommand : public IServerCommand
+  {
+  private:
+    ServerContext& context_;
+    DicomModification modification_;
+
+  public:
+    ModifyInstanceCommand(ServerContext& context) :
+      context_(context)
+    {
+    }
+
+    DicomModification& GetModification()
+    {
+      return modification_;
+    }
+
+    const DicomModification& GetModification() const
+    {
+      return modification_;
+    }
+
+    bool Apply(ListOfStrings& outputs,
+               const ListOfStrings& inputs);
+
+    bool SendOutputsToSink() const
+    {
+      return false;
+    }
+  };
+}
--- a/OrthancServer/ServerContext.cpp	Tue Jul 08 17:35:00 2014 +0200
+++ b/OrthancServer/ServerContext.cpp	Tue Jul 08 18:14:24 2014 +0200
@@ -45,6 +45,7 @@
 
 
 #include "Scheduler/DeleteInstanceCommand.h"
+#include "Scheduler/ModifyInstanceCommand.h"
 #include "Scheduler/StoreScuCommand.h"
 #include "Scheduler/StorePeerCommand.h"
 
@@ -150,6 +151,33 @@
       return new StorePeerCommand(context, parameters);
     }
 
+    if (operation == "modify")
+    {
+      LOG(INFO) << "Lua script to modify instance " << parameters["instance"].asString();
+      std::auto_ptr<ModifyInstanceCommand> command(new ModifyInstanceCommand(context));
+
+      if (parameters.isMember("replacements"))
+      {
+        const Json::Value& replacements = parameters["replacements"];
+        if (replacements.type() != Json::objectValue)
+        {
+          throw OrthancException(ErrorCode_BadParameterType);
+        }
+
+        Json::Value::Members members = replacements.getMemberNames();
+        for (Json::Value::Members::const_iterator
+               it = members.begin(); it != members.end(); ++it)
+        {
+          command->GetModification().Replace(FromDcmtkBridge::ParseTag(*it),
+                                             replacements[*it].asString());
+        }
+
+        // TODO OTHER PARAMETERS OF MODIFY
+      }
+
+      return command.release();
+    }
+
     throw OrthancException(ErrorCode_ParameterOutOfRange);
   }
 
@@ -209,6 +237,13 @@
           throw OrthancException(ErrorCode_InternalError);
         }
 
+        /*
+          TODO
+if (previousCommand != NULL)
+        {
+          previousCommand->ConnectNext(command);
+          }*/
+
         previousCommand = &command;
       }
 
--- a/Resources/Samples/Lua/Autorouting.lua	Tue Jul 08 17:35:00 2014 +0200
+++ b/Resources/Samples/Lua/Autorouting.lua	Tue Jul 08 18:14:24 2014 +0200
@@ -69,12 +69,14 @@
    --PrintRecursive(metadata)
    --print(metadata['RemoteAET'])
 
-   if true then
+   if (metadata['ModifiedFrom'] == nil and
+       metadata['AnonymizedFrom'] == nil) then
       local patientName = string.lower(tags['PatientName'])
       if string.find(patientName, 'david') ~= nil then
          --Delete(SendToModality(instanceId, 'sample'))
          --Delete(SendToPeer(instanceId, 'peer'))
-         Delete(SendToModality(Modify(instanceId, { PatientName = 'Hello^World' }), 'sample'))
+         SendToModality(Modify(instanceId, { PatientName = 'Hello^World' }), 'sample')
+         Delete(instanceId)
       else
          Delete(instanceId)
       end