diff Plugin/Plugin.cpp @ 7:b14ed1ea3a23

reorganization
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 19 Oct 2023 11:14:45 +0200
parents c8f19e93ff99
children 26c08ff926a3
line wrap: on
line diff
--- a/Plugin/Plugin.cpp	Thu Oct 19 08:51:43 2023 +0200
+++ b/Plugin/Plugin.cpp	Thu Oct 19 11:14:45 2023 +0200
@@ -22,6 +22,12 @@
  **/
 
 
+#include "JavaLocalObject.h"
+#include "JavaGlobalReference.h"
+#include "OrthancBytes.h"
+#include "OrthancString.h"
+#include "JavaBytes.h"
+#include "JavaString.h"
 #include "JavaEnvironment.h"
 #include "JavaVirtualMachine.h"
 
@@ -46,307 +52,6 @@
 static std::unique_ptr<JavaVirtualMachine> java_;
 
 
-
-class JavaString : public NonCopyable
-{
-private:
-  JNIEnv*      env_;
-  jstring      javaStr_;
-  const char*  cStr_;
-  jboolean     isCopy_;
-  
-public:
-  JavaString(JNIEnv* env,
-             jstring javaStr) :
-    env_(env),
-    javaStr_(javaStr)
-  {
-    if (env == NULL ||
-        javaStr == NULL)
-    {
-      throw std::runtime_error("Null pointer");
-    }
-
-    cStr_ = env_->GetStringUTFChars(javaStr_, &isCopy_);
-    if (cStr_ == NULL)
-    {
-      throw std::runtime_error("Cannot read string");
-    }
-  }
-
-  ~JavaString()
-  {
-    /**
-     * "The ReleaseString-Chars call is necessary whether
-     * GetStringChars has set isCopy to JNI_TRUE or JNI_FALSE."
-     * https://stackoverflow.com/a/5863081
-     **/
-    env_->ReleaseStringUTFChars(javaStr_, cStr_);
-  }
-
-  const char* GetValue() const
-  {
-    return cStr_;
-  }
-};
-
-
-class JavaBytes : public NonCopyable
-{
-private:
-  JNIEnv*      env_;
-  jbyteArray   bytes_;
-  jbyte*       data_;
-  jsize        size_;
-  jboolean     isCopy_;
-  
-public:
-  JavaBytes(JNIEnv* env,
-            jbyteArray bytes) :
-    env_(env),
-    bytes_(bytes)
-  {
-    if (env == NULL ||
-        bytes == NULL)
-    {
-      throw std::runtime_error("Null pointer");
-    }
-
-    size_ = env->GetArrayLength(bytes);
-
-    if (size_ == 0)
-    {
-      data_ = NULL;
-    }
-    else
-    {
-      data_ = env->GetByteArrayElements(bytes_, &isCopy_);
-      if (data_ == NULL)
-      {
-        throw std::runtime_error("Cannot read array of bytes");
-      }
-    }
-  }
-
-  ~JavaBytes()
-  {
-    if (size_ > 0)
-    {
-      env_->ReleaseByteArrayElements(bytes_, data_, 0);
-    }
-  }
-
-  const void* GetData() const
-  {
-    return data_;
-  }
-
-  size_t GetSize() const
-  {
-    return size_;
-  }
-};
-
-
-class OrthancString : public NonCopyable
-{
-private:
-  char*  str_;
-
-public:
-  OrthancString(char* str) :
-    str_(str)
-  {
-  }
-
-  ~OrthancString()
-  {
-    if (str_ != NULL)
-    {
-      OrthancPluginFreeString(context_, str_);
-    }
-  }
-
-  const char* GetValue() const
-  {
-    return str_;
-  }
-};
-
-
-class OrthancBytes : public NonCopyable
-{
-private:
-  OrthancPluginMemoryBuffer  buffer_;
-
-public:
-  OrthancBytes()
-  {
-    buffer_.data = NULL;
-    buffer_.size = 0;
-  }
-
-  ~OrthancBytes()
-  {
-    OrthancPluginFreeMemoryBuffer(context_, &buffer_);
-  }
-
-  OrthancPluginMemoryBuffer* GetMemoryBuffer()
-  {
-    return &buffer_;
-  }
-
-  const void* GetData() const
-  {
-    return buffer_.data;
-  }
-
-  size_t GetSize() const
-  {
-    return buffer_.size;
-  }
-};
-
-
-class JavaGlobalReference : public NonCopyable
-{
-private:
-  JavaVirtualMachine&  jvm_;
-  jobject obj_;
-
-public:
-  JavaGlobalReference(JavaVirtualMachine& jvm,
-                      jobject obj) :
-    jvm_(jvm),
-    obj_(NULL)
-  {
-    if (obj == NULL)
-    {
-      throw std::runtime_error("Null pointer");
-    }
-
-    JavaEnvironment env(jvm);
-
-    obj_ = env.GetValue().NewGlobalRef(obj);
-    if (obj_ == NULL)
-    {
-      throw std::runtime_error("Cannot create global reference");
-    }
-  }
-
-  ~JavaGlobalReference()
-  {
-    assert(obj_ != NULL);
-
-    try
-    {
-      JavaEnvironment env(jvm_);
-      env.GetValue().DeleteGlobalRef(obj_);
-    }
-    catch (std::runtime_error& e)
-    {
-      OrthancPluginLogError(context_, e.what());
-    }
-  }
-
-  jobject GetValue()
-  {
-    assert(obj_ != NULL);
-    return obj_;
-  }
-};
-
-
-class LocalJavaObject : public NonCopyable
-{
-private:
-  JNIEnv*  env_;
-  jobject  obj_;
-
-public:
-  LocalJavaObject(JavaEnvironment& env,
-                  jobject obj,
-                  bool objCanBeNull = false) :
-    env_(&env.GetValue()),
-    obj_(obj)
-  {
-    if (!objCanBeNull && obj == NULL)
-    {
-      throw std::runtime_error("Null pointer");
-    }
-  }
-
-  ~LocalJavaObject()
-  {
-    env_->DeleteLocalRef(obj_);
-  }
-
-  jobject GetValue()
-  {
-    return obj_;
-  }
-
-  static LocalJavaObject* CreateArrayOfStrings(JavaEnvironment& env,
-                                               const std::vector<std::string>& items)
-  {
-    LocalJavaObject emptyString(env, env.GetValue().NewStringUTF(""));
-
-    jobjectArray obj = env.GetValue().NewObjectArray(
-      items.size(), env.GetValue().FindClass("java/lang/String"),
-      emptyString.GetValue());
-
-    if (obj == NULL)
-    {
-      throw std::runtime_error("Cannot create an array of Java strings");
-    }
-    else
-    {
-      std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
-
-      for (size_t i = 0; i < items.size(); i++)
-      {
-        LocalJavaObject item(env, env.GetValue().NewStringUTF(items[i].c_str()));
-        env.GetValue().SetObjectArrayElement(obj, i, item.GetValue());
-      }
-
-      return result.release();
-    }
-  }
-
-  static LocalJavaObject* CreateDictionary(JavaEnvironment& env,
-                                           const std::map<std::string, std::string>& items)
-  {
-    // NB: In JNI, there are no generics. All the templated arguments
-    // are taken as instances of the "Object" base class.
-
-    jclass cls = env.FindClass("java/util/HashMap");
-    jmethodID constructor = env.GetMethodID(cls, "<init>", "()V");
-    jmethodID setter = env.GetMethodID(cls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-    jobject obj = env.GetValue().NewObject(cls, constructor);
-
-    if (obj == NULL)
-    {
-      throw std::runtime_error("Cannot create a Java dictionary");
-    }
-    else
-    {
-      std::unique_ptr<LocalJavaObject> result(new LocalJavaObject(env, obj));
-
-      for (std::map<std::string, std::string>::const_iterator it = items.begin(); it != items.end(); ++it)
-      {
-        LocalJavaObject key(env, env.GetValue().NewStringUTF(it->first.c_str()));
-        LocalJavaObject value(env, env.GetValue().NewStringUTF(it->second.c_str()));
-        LocalJavaObject previousValue(env, env.GetValue().CallObjectMethod(obj, setter, key.GetValue(), value.GetValue()), true);
-        env.CheckException();
-      }
-
-      return result.release();
-    }
-  }
-};
-
-
-
 #include "NativeSDK.cpp"
 
 
@@ -516,13 +221,13 @@
 
       JavaEnvironment env(*java_);
 
-      LocalJavaObject joutput(env, env.ConstructJavaWrapper("be/uclouvain/orthanc/RestOutput", output));
-      LocalJavaObject jmethod(env, env.ConstructEnumValue("be/uclouvain/orthanc/HttpMethod", request->method));
-      LocalJavaObject juri(env, env.GetValue().NewStringUTF(uri == NULL ? "" : uri));
-      std::unique_ptr<LocalJavaObject> jgroups(LocalJavaObject::CreateArrayOfStrings(env, groups));
-      std::unique_ptr<LocalJavaObject> jheaders(LocalJavaObject::CreateDictionary(env, headers));
-      std::unique_ptr<LocalJavaObject> jgetParameters(LocalJavaObject::CreateDictionary(env, getParameters));
-      LocalJavaObject jbody(env, env.ConstructByteArray(request->bodySize, request->body));
+      JavaLocalObject joutput(env, env.ConstructJavaWrapper("be/uclouvain/orthanc/RestOutput", output));
+      JavaLocalObject jmethod(env, env.ConstructEnumValue("be/uclouvain/orthanc/HttpMethod", request->method));
+      JavaLocalObject juri(env, env.GetValue().NewStringUTF(uri == NULL ? "" : uri));
+      std::unique_ptr<JavaLocalObject> jgroups(JavaLocalObject::CreateArrayOfStrings(env, groups));
+      std::unique_ptr<JavaLocalObject> jheaders(JavaLocalObject::CreateDictionary(env, headers));
+      std::unique_ptr<JavaLocalObject> jgetParameters(JavaLocalObject::CreateDictionary(env, getParameters));
+      JavaLocalObject jbody(env, env.ConstructByteArray(request->bodySize, request->body));
 
       jmethodID call = env.GetMethodID(
         env.GetObjectClass(callback), "call",
@@ -589,9 +294,9 @@
     {
       JavaEnvironment env(*java_);
 
-      LocalJavaObject c(env, env.ConstructEnumValue("be/uclouvain/orthanc/ChangeType", changeType));
-      LocalJavaObject r(env, env.ConstructEnumValue("be/uclouvain/orthanc/ResourceType", resourceType));
-      LocalJavaObject s(env, env.GetValue().NewStringUTF(resourceId == NULL ? "" : resourceId));
+      JavaLocalObject c(env, env.ConstructEnumValue("be/uclouvain/orthanc/ChangeType", changeType));
+      JavaLocalObject r(env, env.ConstructEnumValue("be/uclouvain/orthanc/ResourceType", resourceType));
+      JavaLocalObject s(env, env.GetValue().NewStringUTF(resourceId == NULL ? "" : resourceId));
 
       for (std::list<jobject>::const_iterator
              callback = callbacks.begin(); callback != callbacks.end(); ++callback)