Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Move Java sources (C files) to src/bindings/java/.
[simgrid.git] / src / bindings / java / jxbt_utilities.c
diff --git a/src/bindings/java/jxbt_utilities.c b/src/bindings/java/jxbt_utilities.c
new file mode 100644 (file)
index 0000000..1daf370
--- /dev/null
@@ -0,0 +1,296 @@
+/* Various JNI helper functions                                             */
+
+/* Copyright (c) 2007-2012. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+  * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdlib.h>             /* abort */
+#include "xbt/misc.h"
+#include "xbt/sysdep.h"
+#include "xbt/str.h"
+#include "jxbt_utilities.h"
+
+/* *********** */
+/* JNI GETTERS */
+/* *********** */
+
+jclass jxbt_get_class(JNIEnv * env, const char *name)
+{
+  jclass cls = (*env)->FindClass(env, name);
+
+  if (!cls) {
+    char *m = bprintf("Class %s not found", name);
+    jxbt_throw_jni(env, m);
+    free(m);
+    return NULL;
+  }
+
+  return cls;
+}
+
+jmethodID jxbt_get_jmethod(JNIEnv * env, jclass cls,
+                           const char *name, const char *signature)
+{
+  jmethodID id;
+
+  if (!cls)
+    return 0;
+  id = (*env)->GetMethodID(env, cls, name, signature);
+
+  if (!id) {
+
+    jmethodID tostr_id =
+        (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
+    jstring jclassname =
+        (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
+    const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
+
+    char *m = bprintf("Cannot find method %s(%s) in %s", name, signature,
+                      classname);
+
+    (*env)->ReleaseStringUTFChars(env, jclassname, classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+
+  return id;
+}
+
+jmethodID jxbt_get_static_jmethod(JNIEnv * env, jclass cls,
+                                  const char *name, const char *signature)
+{
+  jmethodID id;
+
+  if (!cls)
+    return 0;
+  id = (*env)->GetStaticMethodID(env, cls, name, signature);
+
+  if (!id) {
+
+    jmethodID tostr_id =
+        (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
+    jstring jclassname =
+        (jstring) (*env)->CallObjectMethod(env, cls, tostr_id, NULL);
+    const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
+
+    char *m =
+        bprintf("Cannot find static method %s(%s) in %s", name, signature,
+                classname);
+
+    (*env)->ReleaseStringUTFChars(env, jclassname, classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+
+  return id;
+}
+
+jmethodID jxbt_get_static_smethod(JNIEnv * env, const char *classname,
+                                  const char *name, const char *signature)
+{
+
+  jclass cls;
+  jmethodID id;
+  cls = jxbt_get_class(env, classname);
+
+  if (!cls)
+    return 0;
+
+  id = (*env)->GetStaticMethodID(env, cls, name, signature);
+
+  if (!id) {
+    char *m =
+        bprintf("Cannot find static method %s(%s) in %s", name, signature,
+                classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+  return id;
+}
+
+jmethodID jxbt_get_smethod(JNIEnv * env, const char *classname,
+                           const char *name, const char *signature)
+{
+
+  jclass cls;
+  jmethodID id;
+  cls = jxbt_get_class(env, classname);
+
+  if (!cls)
+    return 0;
+
+  id = (*env)->GetMethodID(env, cls, name, signature);
+
+  if (!id) {
+    char *m = bprintf("Cannot find method %s(%s) in %s", name, signature,
+                      classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+  return id;
+}
+
+jfieldID jxbt_get_jfield(JNIEnv * env, jclass cls,
+                         const char *name, const char *signature)
+{
+  jfieldID id;
+
+  if (!cls)
+    return 0;
+
+  id = (*env)->GetFieldID(env, cls, name, signature);
+
+  if (!id) {
+    jmethodID getname_id =
+        (*env)->GetMethodID(env, cls, "getName", "()Ljava/lang/String;");
+    jstring jclassname =
+        (jstring) (*env)->CallObjectMethod(env, cls, getname_id, NULL);
+    const char *classname = (*env)->GetStringUTFChars(env, jclassname, 0);
+    char *m = bprintf("Cannot find field %s %s in %s", signature, name,
+                      classname);
+
+    (*env)->ReleaseStringUTFChars(env, jclassname, classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+
+  return id;
+}
+
+jfieldID jxbt_get_sfield(JNIEnv * env, const char *classname,
+                         const char *name, const char *signature)
+{
+  jclass cls = jxbt_get_class(env, classname);
+  jfieldID id;
+
+  if (!cls)
+    return 0;
+
+  id = (*env)->GetFieldID(env, cls, name, signature);
+
+  if (!id) {
+    char *m = bprintf("Cannot find field %s %s in %s", signature, name,
+                      classname);
+
+    jxbt_throw_jni(env, m);
+
+    free(m);
+    return 0;
+  }
+
+  return id;
+}
+
+/* ***************** */
+/* EXCEPTION RAISING */
+/* ***************** */
+void jxbt_throw_by_name(JNIEnv * env, const char *name, char *msg)
+{
+  jclass cls = (*env)->FindClass(env, name);
+
+  xbt_assert(cls, "%s (Plus severe error: class %s not found)\n", msg,
+              name);
+
+  (*env)->ThrowNew(env, cls, msg);
+
+  free(msg);
+}
+
+
+/* Errors in MSG */
+void jxbt_throw_jni(JNIEnv * env, const char *msg)
+{
+  jxbt_throw_by_name(env,
+                     "org/simgrid/msg/JniException",
+                     bprintf("Internal or JNI error: %s", msg));
+}
+
+void jxbt_throw_notbound(JNIEnv * env, const char *kind, void *pointer)
+{
+  jxbt_throw_by_name(env,
+                     "org/simgrid/msg/JniException",
+                     bprintf("Internal error: %s %p not bound", kind,
+                             pointer));
+}
+
+void jxbt_throw_native(JNIEnv * env, char *msg)
+{
+  jxbt_throw_by_name(env, "org/simgrid/msg/NativeException", msg);
+}
+
+/* *** */
+void jxbt_throw_null(JNIEnv * env, char *msg)
+{
+  jxbt_throw_by_name(env, "java/lang/NullPointerException", msg);
+}
+
+/* Errors on user side */
+void jxbt_throw_illegal(JNIEnv * env, char *msg)
+{
+  jxbt_throw_by_name(env, "java/lang/IllegalArgumentException", msg);
+}
+
+void jxbt_throw_host_not_found(JNIEnv * env, const char *invalid_name)
+{
+  jxbt_throw_by_name(env,
+                     "org/simgrid/msg/HostNotFoundException",
+                     bprintf("No such host: %s", invalid_name));
+}
+
+void jxbt_throw_process_not_found(JNIEnv * env, const char *invalid_name)
+{
+  jxbt_throw_by_name(env,
+                     "org/simgrid/msg/ProcessNotFoundException",
+                     bprintf("No such process: %s", invalid_name));
+}
+
+// tranfert failure
+void jxbt_throw_transfer_failure(JNIEnv * env, char *details)
+{
+
+  jxbt_throw_by_name(env, "org/simgrid/msg/TransferFailureException", details);
+
+}
+
+// host failure Exception
+void jxbt_throw_host_failure(JNIEnv * env, char *details)
+{
+
+  jxbt_throw_by_name(env,
+                     "org/simgrid/msg/HostFailureException",
+                     bprintf("Host Failure %s", details));
+
+}
+
+// time out failure Exception
+void jxbt_throw_time_out_failure(JNIEnv * env, char *details)
+{
+
+  jxbt_throw_by_name(env, "org/simgrid/msg/TimeoutException", details);
+
+}
+
+// task Cancelled exception
+void jxbt_throw_task_cancelled(JNIEnv * env, char *details)
+{
+
+  jxbt_throw_by_name(env, "org/simgrid/msg/TaskCancelledException", details);
+
+}