Richard W.M. Jones
2011-Mar-02 05:14 UTC
[Libguestfs] [PATCH 0/6] Various Java bindings fixes.
This short patch series fixes various problems with the Java bindings, including enabling support for functions that return hash tables (returned as Map<String,String>). With this, the Java bindings are improved although still not perfect. The last remaining issue is to implement support for functions that take optional arguments. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org
Richard W.M. Jones
2011-Mar-02 05:15 UTC
[Libguestfs] [PATCH 1/6] java: Enable assertions when doing 'make check'.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora -------------- next part -------------->From db98ac041ec36c4e2ce322d336f5792fa8e6922d Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 05:08:20 +0000 Subject: [PATCH 1/6] java: Enable assertions when doing 'make check'. It turns out that Java assertions are disabled by default. You have to add the 'java -ea' flag to the JVM. Who knew ..? Because of this oversight, the tests weren't actually performing the assertions that we wanted (although in fact none of the assertions were failing). This change enables assertions when running the tests. --- java/run-java-tests | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/run-java-tests b/java/run-java-tests index 8447160..64ce079 100755 --- a/java/run-java-tests +++ b/java/run-java-tests @@ -1,6 +1,6 @@ #!/bin/sh - # libguestfs Perl bindings -# Copyright (C) 2009 Red Hat Inc. +# Copyright (C) 2009-2011 Red Hat Inc. # # 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 @@ -20,5 +20,5 @@ set -e for f in t/*.class; do classname=$(basename $f .class) - $JAVA -Djava.library.path=.libs $classname + $JAVA -Djava.library.path=.libs -ea $classname done \ No newline at end of file -- 1.7.4
Richard W.M. Jones
2011-Mar-02 05:15 UTC
[Libguestfs] [PATCH 2/6] java: Remove old test file if one was left around.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://et.redhat.com/~rjones/virt-top -------------- next part -------------->From 80aad709954cc4a3a294200e242876599047cef8 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 05:10:31 +0000 Subject: [PATCH 2/6] java: Remove old test file if one was left around. If a test.img file was left over from a previous run, then it would cause the subsequent test to fail. Therefore remove any old test.img file. --- java/t/GuestFS010Basic.java | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/java/t/GuestFS010Basic.java b/java/t/GuestFS010Basic.java index f4778dc..137fad3 100644 --- a/java/t/GuestFS010Basic.java +++ b/java/t/GuestFS010Basic.java @@ -24,6 +24,10 @@ public class GuestFS010Basic public static void main (String[] argv) { try { + // Delete any previous test file if one was left around. + File old = new File ("test.img"); + old.delete (); + RandomAccessFile f = new RandomAccessFile ("test.img", "rw"); f.setLength (500 * 1024 * 1024); f.close (); -- 1.7.4
Richard W.M. Jones
2011-Mar-02 05:15 UTC
[Libguestfs] [PATCH 3/6] java: Fix a minor whitespace error in generated code.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora -------------- next part -------------->From e7d63b853fbd0b08eb7c0586b6541fe9fceb7780 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 04:30:30 +0000 Subject: [PATCH 3/6] java: Fix a minor whitespace error in generated code. In functions didn't have javadoc, the function prototype wasn't being indented correctly. --- generator/generator_java.ml | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generator/generator_java.ml b/generator/generator_java.ml index 5ac92f7..e2e0003 100644 --- a/generator/generator_java.ml +++ b/generator/generator_java.ml @@ -1,5 +1,5 @@ (* libguestfs - * Copyright (C) 2009-2010 Red Hat Inc. + * Copyright (C) 2009-2011 Red Hat Inc. * * 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 @@ -133,8 +133,8 @@ public class GuestFS { pr " * %s\n" doc; pr " * @throws LibGuestFSException\n"; pr " */\n"; - pr " "; ); + pr " "; generate_java_prototype ~public:true ~semicolon:false name style; pr "\n"; pr " {\n"; -- 1.7.4
Richard W.M. Jones
2011-Mar-02 05:16 UTC
[Libguestfs] [PATCH 4/6] java: Return Map<String, String> for RHashtable functions.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v -------------- next part -------------->From 4373acea5bae867d8386328bf8da9dc4c071df0a Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 04:33:39 +0000 Subject: [PATCH 4/6] java: Return Map<String,String> for RHashtable functions. There's no point returning the specific HashMap type here. Return the generic interface type instead. Note that no users are actually calling these functions yet, since at present they always fail. --- generator/generator_java.ml | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/generator/generator_java.ml b/generator/generator_java.ml index e2e0003..90ae263 100644 --- a/generator/generator_java.ml +++ b/generator/generator_java.ml @@ -37,6 +37,7 @@ let rec generate_java_java () package com.redhat.et.libguestfs; import java.util.HashMap; +import java.util.Map; import com.redhat.et.libguestfs.LibGuestFSException; import com.redhat.et.libguestfs.PV; import com.redhat.et.libguestfs.VG; @@ -183,7 +184,7 @@ and generate_java_prototype ?(public=false) ?(privat=false) ?(native=false) | RStructList (_, typ) -> let name = java_name_of_struct typ in pr "%s[] " name; - | RHashtable _ -> pr "HashMap<String,String> "; + | RHashtable _ -> pr "Map<String,String> "; ); if native then pr "_%s " name else pr "%s " name; -- 1.7.4
Richard W.M. Jones
2011-Mar-02 05:16 UTC
[Libguestfs] [PATCH 5/6] java: Fix generated functions that return RHashtable.
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-top is 'top' for virtual machines. Tiny program with many powerful monitoring features, net stats, disk stats, logging, etc. http://et.redhat.com/~rjones/virt-top -------------- next part -------------->From 4c6ceb8ccee793548291862c19a0f33e67d7e1e5 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 04:49:12 +0000 Subject: [PATCH 5/6] java: Fix generated functions that return RHashtable. Creating a HashMap directly from JNI is possible but very tedious (see: http://java.sun.com/docs/books/jni/html/fldmeth.html#26254) Instead we use the existing code to return hashes from JNI as plain String[], then add some code in the Java wrapper to convert these to HashMap<String,String>. --- generator/generator_java.ml | 45 ++++++++++++++++++++++++++++-------------- 1 files changed, 30 insertions(+), 15 deletions(-) diff --git a/generator/generator_java.ml b/generator/generator_java.ml index 90ae263..dedf962 100644 --- a/generator/generator_java.ml +++ b/generator/generator_java.ml @@ -142,11 +142,25 @@ public class GuestFS { pr " if (g == 0)\n"; pr " throw new LibGuestFSException (\"%s: handle is closed\");\n" name; - pr " "; - if ret <> RErr then pr "return "; - pr "_%s " name; - generate_java_call_args ~handle:"g" style; - pr ";\n"; + (match ret with + | RErr -> + pr " _%s " name; + generate_java_call_args ~handle:"g" style; + pr ";\n" + | RHashtable _ -> + pr " String[] r = _%s " name; + generate_java_call_args ~handle:"g" style; + pr ";\n"; + pr "\n"; + pr " HashMap rhash = new HashMap ();\n"; + pr " for (int i = 0; i < r.length; i += 2)\n"; + pr " rhash.put (r[i], r[i+1]);\n"; + pr " return rhash;\n" + | _ -> + pr " return _%s " name; + generate_java_call_args ~handle:"g" style; + pr ";\n" + ); pr " }\n"; pr " "; generate_java_prototype ~privat:true ~native:true name style; @@ -184,7 +198,11 @@ and generate_java_prototype ?(public=false) ?(privat=false) ?(native=false) | RStructList (_, typ) -> let name = java_name_of_struct typ in pr "%s[] " name; - | RHashtable _ -> pr "Map<String,String> "; + | RHashtable _ -> + if not native then + pr "Map<String,String> " + else + pr "String[] "; ); if native then pr "_%s " name else pr "%s " name; @@ -367,7 +385,8 @@ Java_com_redhat_et_libguestfs_GuestFS__1close | RString _ -> pr " jstring jr;\n"; pr " char *r;\n"; "NULL", "NULL" - | RStringList _ -> + | RStringList _ + | RHashtable _ -> pr " jobjectArray jr;\n"; pr " int r_len;\n"; pr " jclass cl;\n"; @@ -384,7 +403,6 @@ Java_com_redhat_et_libguestfs_GuestFS__1close pr " jfieldID fl;\n"; pr " jobject jfl;\n"; pr " struct guestfs_%s_list *r;\n" typ; "NULL", "NULL" - | RHashtable _ -> pr " char **r;\n"; "NULL", "NULL" | RBufferOut _ -> pr " jstring jr;\n"; pr " char *r;\n"; @@ -417,10 +435,10 @@ Java_com_redhat_et_libguestfs_GuestFS__1close let needs_i (match ret with - | RStringList _ | RStructList _ -> true + | RStringList _ | RStructList _ | RHashtable _ -> true | RErr | RBool _ | RInt _ | RInt64 _ | RConstString _ | RConstOptString _ - | RString _ | RBufferOut _ | RStruct _ | RHashtable _ -> false) || + | RString _ | RBufferOut _ | RStruct _ -> false) || List.exists (function | StringList _ -> true | DeviceList _ -> true @@ -527,7 +545,8 @@ Java_com_redhat_et_libguestfs_GuestFS__1close pr " jr = (*env)->NewStringUTF (env, r);\n"; pr " free (r);\n"; pr " return jr;\n" - | RStringList _ -> + | RStringList _ + | RHashtable _ -> pr " for (r_len = 0; r[r_len] != NULL; ++r_len) ;\n"; pr " cl = (*env)->FindClass (env, \"java/lang/String\");\n"; pr " jstr = (*env)->NewStringUTF (env, \"\");\n"; @@ -547,10 +566,6 @@ Java_com_redhat_et_libguestfs_GuestFS__1close let jtyp = java_name_of_struct typ in let cols = cols_of_struct typ in generate_java_struct_list_return typ jtyp cols - | RHashtable _ -> - (* XXX *) - pr " throw_exception (env, \"%s: internal error: please let us know how to make a Java HashMap from JNI bindings!\");\n" name; - pr " return NULL;\n" | RBufferOut _ -> pr " jr = (*env)->NewStringUTF (env, r); /* XXX size */\n"; pr " free (r);\n"; -- 1.7.4
Richard W.M. Jones
2011-Mar-02 05:16 UTC
[Libguestfs] [PATCH 6/6] java: Add a test of g.list_filesystems (a function that returns a Map).
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming blog: http://rwmj.wordpress.com Fedora now supports 80 OCaml packages (the OPEN alternative to F#) http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora -------------- next part -------------->From 1aa95f3af2b4a55176eca9e8995304da8dfe0b05 Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Wed, 2 Mar 2011 05:11:10 +0000 Subject: [PATCH 6/6] java: Add a test of g.list_filesystems (a function that returns a Map). --- java/t/GuestFS010Basic.java | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/java/t/GuestFS010Basic.java b/java/t/GuestFS010Basic.java index 137fad3..84b96f8 100644 --- a/java/t/GuestFS010Basic.java +++ b/java/t/GuestFS010Basic.java @@ -17,6 +17,7 @@ */ import java.io.*; +import java.util.Map; import com.redhat.et.libguestfs.*; public class GuestFS010Basic @@ -45,6 +46,15 @@ public class GuestFS010Basic assert lvs[0].equals ("/dev/VG/LV1"); assert lvs[1].equals ("/dev/VG/LV2"); + g.mkfs ("ext2", "/dev/VG/LV1"); + + Map<String,String> m = g.list_filesystems (); + assert m.containsKey ("/dev/VG/LV1"); + assert m.size () == 2; + + assert m.get ("/dev/VG/LV1").equals ("ext2"); + assert m.get ("/dev/VG/LV2").equals ("unknown"); + g.close (); File f2 = new File ("test.img"); -- 1.7.4
Possibly Parallel Threads
- [PATCH 0/12] Add support for writing to hive files
- [PATCH 0/2] First part of fix for CVE-2010-3851
- [PATCH 0/5] 5 conservative changes to errno handling
- [PATCH 0/4] Allow QEMU if=... (block device emulation) to be overridden
- KVM Image not working after expansion