]> granicus.if.org Git - php/commitdiff
Pass PHP arrays to Java as hash tables; minor cleanup
authorSam Ruby <rubys@php.net>
Fri, 21 Jul 2000 22:08:50 +0000 (22:08 +0000)
committerSam Ruby <rubys@php.net>
Fri, 21 Jul 2000 22:08:50 +0000 (22:08 +0000)
ext/java/java.c
ext/java/reflect.java
ext/rpc/java/java.c
ext/rpc/java/reflect.java

index 83db3d4b7aa7ed99213f29cdd7de70021fb47313..701640b0e53f7ad88d2358ad307f2425b1c75a57 100644 (file)
@@ -82,7 +82,7 @@ typedef struct {
 #define JG_FETCH() php_java_globals *java_globals = ts_resource(java_globals_id)
 #define JG_D       php_java_globals *java_globals
 #define JG_DC      , JG_D
-#define JG_C       dir_globals
+#define JG_C       java_globals
 #define JG_CC      , JG_C
 int java_globals_id;
 #else
@@ -276,58 +276,114 @@ static int jvm_create() {
 
 /***************************************************************************/
 
-static jobjectArray _java_makeArray(int argc, pval** argv) {
-  JG_FETCH();
+static jobject _java_makeObject(pval* arg JG_DC) {
+  JNIEnv *jenv = JG(jenv);
+  jobject result;
+  pval **handle;
+  int type;
+  jmethodID makeArg;
+  jclass hashClass;
+
+  switch (arg->type) {
+    case IS_STRING:
+      result=(*jenv)->NewByteArray(jenv,arg->value.str.len);
+      (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0,
+        arg->value.str.len, arg->value.str.val);
+      break;
+
+    case IS_OBJECT:
+      zend_hash_index_find(arg->value.obj.properties, 0, (void*)&handle);
+      result = zend_list_find((*handle)->value.lval, &type);
+      break;
+
+    case IS_BOOL:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(Z)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jboolean)(arg->value.lval));
+      break;
+
+    case IS_LONG:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(J)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jlong)(arg->value.lval));
+      break;
+
+    case IS_DOUBLE:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(D)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jdouble)(arg->value.dval));
+      break;
+
+    case IS_ARRAY:
+      {
+      jobject jkey, jval;
+      zval **value;
+      zval key;
+      char *string_key;
+      ulong num_key;
+      jobject jold;
+      jmethodID put, init;
+
+      hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable");
+      init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V");
+      result = (*jenv)->NewObject(jenv, hashClass, init);
+
+      put = (*jenv)->GetMethodID(jenv, hashClass, "put",
+        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+
+      /* Iterate through hash */
+      zend_hash_internal_pointer_reset(arg->value.ht);
+      while(zend_hash_get_current_data(arg->value.ht, (void**)&value) == SUCCESS) {
+        jval = _java_makeObject(*value JG_CC);
+
+        switch (zend_hash_get_current_key(arg->value.ht, &string_key, &num_key)) {
+          case HASH_KEY_IS_STRING:
+            key.type = IS_STRING;
+            key.value.str.val = string_key;
+            key.value.str.len = strlen(string_key);
+            jkey = _java_makeObject(&key JG_CC);
+            efree(string_key);
+            break;
+          case HASH_KEY_IS_LONG:
+            key.type = IS_LONG;
+            key.value.lval = num_key;
+            jkey = _java_makeObject(&key JG_CC);
+            break;
+          default: /* HASH_KEY_NON_EXISTANT */
+            jkey = 0;
+        }
+        jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval);
+        if ((*value)->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval);
+        zend_hash_move_forward(arg->value.ht);
+      }
+
+      break;
+      }
+
+    default:
+      result=0;
+  }
+
+  return result;
+}
+
+/***************************************************************************/
+
+static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) {
   JNIEnv *jenv = JG(jenv);
 
   jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object");
   jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0);
   jobject arg;
-  jmethodID makeArg;
   int i;
-  pval **handle;
-  int type;
 
   for (i=0; i<argc; i++) {
-    switch (argv[i]->type) {
-      case IS_STRING:
-        arg=(*jenv)->NewByteArray(jenv,argv[i]->value.str.len);
-        (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0,
-          argv[i]->value.str.len, argv[i]->value.str.val);
-        break;
-
-      case IS_OBJECT:
-        zend_hash_index_find(argv[i]->value.obj.properties, 0, (void*)&handle);
-        arg = zend_list_find((*handle)->value.lval, &type);
-        break;
-
-      case IS_BOOL:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(Z)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jboolean)(argv[i]->value.lval));
-        break;
-
-      case IS_LONG:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(J)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jlong)(argv[i]->value.lval));
-        break;
-
-      case IS_DOUBLE:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(D)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jdouble)(argv[i]->value.dval));
-        break;
-
-      default:
-        arg=0;
-    }
+    arg = _java_makeObject(argv[i] JG_CC);
     (*jenv)->SetObjectArrayElement(jenv, result, i, arg);
-    if (argv[i]->type != IS_OBJECT)
-    (*jenv)->DeleteLocalRef(jenv, arg);
+    if (argv[i]->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg);
   }
   return result;
 }
@@ -382,7 +438,7 @@ void java_call_function_handler
     (pval*)(long)result = object;
 
     (*jenv)->CallVoidMethod(jenv, JG(php_reflect), co,
-      className, _java_makeArray(arg_count-1, arguments+1), result);
+      className, _java_makeArray(arg_count-1, arguments+1 JG_CC), result);
 
     (*jenv)->DeleteLocalRef(jenv, className);
 
@@ -403,7 +459,7 @@ void java_call_function_handler
     (pval*)(long)result = return_value;
 
     (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke,
-      obj, method, _java_makeArray(arg_count, arguments), result);
+      obj, method, _java_makeArray(arg_count, arguments JG_CC), result);
 
     (*jenv)->DeleteLocalRef(jenv, method);
 
@@ -508,8 +564,9 @@ pval java_get_property_handler
 int java_set_property_handler
   (zend_property_reference *property_reference, pval *value)
 {
+  JG_FETCH();
   pval presult = _java_getset_property
-    (property_reference, _java_makeArray(1, &value));
+    (property_reference, _java_makeArray(1, &value JG_CC));
   return checkError(&presult) ? FAILURE : SUCCESS;
 }
 
index 3cf53aece288ddfac39cfbc0984255ebe9c824a2..f5b43a96a89144afab83e1cefc11e5fe05b4a861 100644 (file)
@@ -236,7 +236,6 @@ public class reflect {
   public void Invoke
     (Object object, String method, Object args[], long result)
   {
-
     try {
       Vector matches = new Vector();
 
@@ -284,7 +283,6 @@ public class reflect {
   public void GetSetProp
     (Object object, String prop, Object args[], long result)
   {
-System.out.println(object + "." + prop);
     try {
 
       for (Class jclass = object.getClass();;jclass=(Class)object) {
index 83db3d4b7aa7ed99213f29cdd7de70021fb47313..701640b0e53f7ad88d2358ad307f2425b1c75a57 100644 (file)
@@ -82,7 +82,7 @@ typedef struct {
 #define JG_FETCH() php_java_globals *java_globals = ts_resource(java_globals_id)
 #define JG_D       php_java_globals *java_globals
 #define JG_DC      , JG_D
-#define JG_C       dir_globals
+#define JG_C       java_globals
 #define JG_CC      , JG_C
 int java_globals_id;
 #else
@@ -276,58 +276,114 @@ static int jvm_create() {
 
 /***************************************************************************/
 
-static jobjectArray _java_makeArray(int argc, pval** argv) {
-  JG_FETCH();
+static jobject _java_makeObject(pval* arg JG_DC) {
+  JNIEnv *jenv = JG(jenv);
+  jobject result;
+  pval **handle;
+  int type;
+  jmethodID makeArg;
+  jclass hashClass;
+
+  switch (arg->type) {
+    case IS_STRING:
+      result=(*jenv)->NewByteArray(jenv,arg->value.str.len);
+      (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0,
+        arg->value.str.len, arg->value.str.val);
+      break;
+
+    case IS_OBJECT:
+      zend_hash_index_find(arg->value.obj.properties, 0, (void*)&handle);
+      result = zend_list_find((*handle)->value.lval, &type);
+      break;
+
+    case IS_BOOL:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(Z)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jboolean)(arg->value.lval));
+      break;
+
+    case IS_LONG:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(J)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jlong)(arg->value.lval));
+      break;
+
+    case IS_DOUBLE:
+      makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
+        "(D)Ljava/lang/Object;");
+      result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
+        (jdouble)(arg->value.dval));
+      break;
+
+    case IS_ARRAY:
+      {
+      jobject jkey, jval;
+      zval **value;
+      zval key;
+      char *string_key;
+      ulong num_key;
+      jobject jold;
+      jmethodID put, init;
+
+      hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable");
+      init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V");
+      result = (*jenv)->NewObject(jenv, hashClass, init);
+
+      put = (*jenv)->GetMethodID(jenv, hashClass, "put",
+        "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+
+      /* Iterate through hash */
+      zend_hash_internal_pointer_reset(arg->value.ht);
+      while(zend_hash_get_current_data(arg->value.ht, (void**)&value) == SUCCESS) {
+        jval = _java_makeObject(*value JG_CC);
+
+        switch (zend_hash_get_current_key(arg->value.ht, &string_key, &num_key)) {
+          case HASH_KEY_IS_STRING:
+            key.type = IS_STRING;
+            key.value.str.val = string_key;
+            key.value.str.len = strlen(string_key);
+            jkey = _java_makeObject(&key JG_CC);
+            efree(string_key);
+            break;
+          case HASH_KEY_IS_LONG:
+            key.type = IS_LONG;
+            key.value.lval = num_key;
+            jkey = _java_makeObject(&key JG_CC);
+            break;
+          default: /* HASH_KEY_NON_EXISTANT */
+            jkey = 0;
+        }
+        jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval);
+        if ((*value)->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval);
+        zend_hash_move_forward(arg->value.ht);
+      }
+
+      break;
+      }
+
+    default:
+      result=0;
+  }
+
+  return result;
+}
+
+/***************************************************************************/
+
+static jobjectArray _java_makeArray(int argc, pval** argv JG_DC) {
   JNIEnv *jenv = JG(jenv);
 
   jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object");
   jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0);
   jobject arg;
-  jmethodID makeArg;
   int i;
-  pval **handle;
-  int type;
 
   for (i=0; i<argc; i++) {
-    switch (argv[i]->type) {
-      case IS_STRING:
-        arg=(*jenv)->NewByteArray(jenv,argv[i]->value.str.len);
-        (*jenv)->SetByteArrayRegion(jenv,(jbyteArray)arg,0,
-          argv[i]->value.str.len, argv[i]->value.str.val);
-        break;
-
-      case IS_OBJECT:
-        zend_hash_index_find(argv[i]->value.obj.properties, 0, (void*)&handle);
-        arg = zend_list_find((*handle)->value.lval, &type);
-        break;
-
-      case IS_BOOL:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(Z)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jboolean)(argv[i]->value.lval));
-        break;
-
-      case IS_LONG:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(J)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jlong)(argv[i]->value.lval));
-        break;
-
-      case IS_DOUBLE:
-        makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
-          "(D)Ljava/lang/Object;");
-        arg = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
-          (jdouble)(argv[i]->value.dval));
-        break;
-
-      default:
-        arg=0;
-    }
+    arg = _java_makeObject(argv[i] JG_CC);
     (*jenv)->SetObjectArrayElement(jenv, result, i, arg);
-    if (argv[i]->type != IS_OBJECT)
-    (*jenv)->DeleteLocalRef(jenv, arg);
+    if (argv[i]->type != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg);
   }
   return result;
 }
@@ -382,7 +438,7 @@ void java_call_function_handler
     (pval*)(long)result = object;
 
     (*jenv)->CallVoidMethod(jenv, JG(php_reflect), co,
-      className, _java_makeArray(arg_count-1, arguments+1), result);
+      className, _java_makeArray(arg_count-1, arguments+1 JG_CC), result);
 
     (*jenv)->DeleteLocalRef(jenv, className);
 
@@ -403,7 +459,7 @@ void java_call_function_handler
     (pval*)(long)result = return_value;
 
     (*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke,
-      obj, method, _java_makeArray(arg_count, arguments), result);
+      obj, method, _java_makeArray(arg_count, arguments JG_CC), result);
 
     (*jenv)->DeleteLocalRef(jenv, method);
 
@@ -508,8 +564,9 @@ pval java_get_property_handler
 int java_set_property_handler
   (zend_property_reference *property_reference, pval *value)
 {
+  JG_FETCH();
   pval presult = _java_getset_property
-    (property_reference, _java_makeArray(1, &value));
+    (property_reference, _java_makeArray(1, &value JG_CC));
   return checkError(&presult) ? FAILURE : SUCCESS;
 }
 
index 3cf53aece288ddfac39cfbc0984255ebe9c824a2..f5b43a96a89144afab83e1cefc11e5fe05b4a861 100644 (file)
@@ -236,7 +236,6 @@ public class reflect {
   public void Invoke
     (Object object, String method, Object args[], long result)
   {
-
     try {
       Vector matches = new Vector();
 
@@ -284,7 +283,6 @@ public class reflect {
   public void GetSetProp
     (Object object, String prop, Object args[], long result)
   {
-System.out.println(object + "." + prop);
     try {
 
       for (Class jclass = object.getClass();;jclass=(Class)object) {