[libvirt] [PATCH] Exceptions are working using the callback

Bryan Kearney bkearney at redhat.com
Sat Jul 25 12:02:10 UTC 2009


---
 src/org/libvirt/Connect.java      |   86 +++++++++++++++++++++++++-----------
 src/org/libvirt/Error.java        |    8 ++-
 src/org/libvirt/ErrorHandler.java |   16 ++++---
 src/org/libvirt/Network.java      |   24 +++++++++-
 src/org/libvirt/jna/Libvirt.java  |   12 ++---
 src/org/libvirt/jna/virError.java |    7 ++-
 src/test.java                     |    8 ++--
 7 files changed, 108 insertions(+), 53 deletions(-)

diff --git a/src/org/libvirt/Connect.java b/src/org/libvirt/Connect.java
index b559b52..218bda3 100644
--- a/src/org/libvirt/Connect.java
+++ b/src/org/libvirt/Connect.java
@@ -23,7 +23,12 @@ public class Connect {
 	// Load the native part
 	static {
 		Libvirt.INSTANCE.virInitialize() ;
-		Libvirt.INSTANCE.virSetErrorFunc(0, ErrorHandler.INSTANCE) ;
+		try {
+		    ErrorHandler.processError(Libvirt.INSTANCE) ;
+		}
+		catch (Exception e) {
+		    e.printStackTrace() ;
+		}
 	}
 
 	/**
@@ -63,8 +68,7 @@ public class Connect {
             VCP = libvirt.virConnectOpen(uri) ;
 		}
 		// Check for an error		
-//        processError(libvirt.virGetLastError()) ;
-        libvirt.virConnSetErrorFunc(VCP,0,ErrorHandler.INSTANCE) ;		
+        processError() ;		
 	}
 
 	/**
@@ -91,10 +95,11 @@ public class Connect {
 	 */
 	public Connect(String uri) throws LibvirtException {
         VCP = libvirt.virConnectOpen(uri) ;
+        processError() ;                
 	}
 
 	public void finalize() throws LibvirtException {
-		close();
+		close();      		
 	}
 
 
@@ -105,6 +110,7 @@ public class Connect {
 	 */
 	public void close() throws LibvirtException {
 	    libvirt.virConnectClose(VCP) ;
+        processError() ;        	    
 		// If leave an invalid pointer dangling around JVM crashes and burns if
 		// someone tries to call a method on us
 		// We rely on the underlying libvirt error handling to detect that it's called with a null virConnectPointer
@@ -121,7 +127,9 @@ public class Connect {
 	 *
 	 */
 	public String getCapabilities() throws LibvirtException {
-	    return libvirt.virConnectGetCapabilities(VCP) ;
+	    String returnValue = libvirt.virConnectGetCapabilities(VCP) ;
+        processError() ;       
+        return returnValue ;
 	}
 
 
@@ -135,6 +143,7 @@ public class Connect {
 	 */
 	public String getHostName() throws LibvirtException {
 		String returnValue = libvirt.virConnectGetHostname(VCP) ;
+        processError() ;        		
         return returnValue ;
 		
 	}
@@ -149,7 +158,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public int getMaxVcpus(String type) throws LibvirtException {
-		return libvirt.virConnectGetMaxVcpus(VCP, type) ;
+		int returnValue = libvirt.virConnectGetMaxVcpus(VCP, type) ;
+        processError() ;        
+        return returnValue ;
 	}
 
 
@@ -160,7 +171,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public String getType() throws LibvirtException {
-		return libvirt.virConnectGetType(VCP) ;
+		String returnValue = libvirt.virConnectGetType(VCP) ;
+        processError() ;        
+        return returnValue ;
 	}
 
 	
@@ -174,7 +187,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public String getURI() throws LibvirtException {
-		return libvirt.virConnectGetURI(VCP) ;
+		String returnValue = libvirt.virConnectGetURI(VCP) ;
+        processError() ;      
+        return returnValue ;
 	}
 
 
@@ -190,6 +205,7 @@ public class Connect {
 	public long getVersion() throws LibvirtException {
 	    LongByReference hvVer = new LongByReference() ;
 		libvirt.virConnectGetVersion(VCP, hvVer) ;
+        processError() ;        		
 		return hvVer.getValue();
 	}
 
@@ -204,6 +220,7 @@ public class Connect {
         LongByReference libVer = new LongByReference() ;
         LongByReference typeVer = new LongByReference() ;        
         libvirt.virGetVersion(libVer, null, typeVer) ;
+        processError() ;                
         return libVer.getValue();	    
 	}
 
@@ -220,6 +237,7 @@ public class Connect {
         LongByReference libVer = new LongByReference() ;
         LongByReference typeVer = new LongByReference() ;        
         libvirt.virGetVersion(libVer, type, typeVer) ;
+        processError() ;                
         return libVer.getValue();       
 	}
 
@@ -233,8 +251,9 @@ public class Connect {
 	public String[] listDefinedDomains() throws LibvirtException {
 	    int maxnames = this.numOfDefinedDomains() ;
 	    String[] names = new String[maxnames] ;
-        if (maxnames > 0) {	    
+        if (maxnames > 0) {	                
             libvirt.virConnectListDefinedDomains(VCP, names, maxnames) ;
+            processError() ;                    
         }
 	    return names ;
 	}
@@ -252,6 +271,7 @@ public class Connect {
         
         if (maxnames > 0) {
             libvirt.virConnectListDefinedNetworks(VCP, names, maxnames) ;
+            processError() ;                    
         }
         return names ;
 	}
@@ -269,6 +289,7 @@ public class Connect {
         
         if (maxids > 0) {
             libvirt.virConnectListDomains(VCP, ids, maxids) ;
+            processError() ;                    
         }
         return ids ;
 	}
@@ -286,6 +307,7 @@ public class Connect {
         
         if (maxnames > 0) {
             libvirt.virConnectListNetworks(VCP, names, maxnames) ;
+            processError() ;                    
         }
         return names ;
 	}
@@ -298,7 +320,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public int numOfDefinedDomains() throws LibvirtException {
-	    return libvirt.virConnectNumOfDefinedDomains(VCP) ;
+	    int returnValue = libvirt.virConnectNumOfDefinedDomains(VCP) ;
+        processError() ; 
+        return returnValue ;
 	}
 
 
@@ -310,7 +334,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public int numOfDefinedNetworks() throws LibvirtException {
-        return libvirt.virConnectNumOfDefinedNetworks(VCP) ;
+        int returnValue = libvirt.virConnectNumOfDefinedNetworks(VCP) ;
+        processError() ;        
+        return returnValue ;
 	}
 
 	
@@ -321,7 +347,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public int numOfDomains() throws LibvirtException {
-        return libvirt.virConnectNumOfDomains(VCP) ;
+        int returnValue = libvirt.virConnectNumOfDomains(VCP) ;
+        processError() ;        
+        return returnValue ;
 	}
 
 
@@ -332,7 +360,9 @@ public class Connect {
 	 * @throws LibvirtException
 	 */
 	public int numOfNetworks() throws LibvirtException {
-        return libvirt.virConnectNumOfNetworks(VCP) ;
+        int returnValue =  libvirt.virConnectNumOfNetworks(VCP) ;
+        processError() ;        
+        return returnValue ;
 	}
 
 
@@ -349,6 +379,7 @@ public class Connect {
 	throws LibvirtException {
 	    Network returnValue = null ;
 	    Pointer ptr = libvirt.virNetworkLookupByName(VCP, name) ;
+        processError() ;        	    
 	    if (ptr != null) {
 	        returnValue = new Network(this, ptr) ;
 	    }
@@ -372,6 +403,7 @@ public class Connect {
 	    }
         Network returnValue = null ;
         Pointer ptr = libvirt.virNetworkLookupByUUID(VCP, uuidString.toString()) ;
+        processError() ;        
         if (ptr != null) {
             returnValue = new Network(this, ptr) ;
         }
@@ -390,6 +422,7 @@ public class Connect {
 	throws LibvirtException {
         Network returnValue = null ;
         Pointer ptr = libvirt.virNetworkLookupByUUIDString(VCP, UUID);
+        processError() ;                
         if (ptr != null) {
             returnValue = new Network(this, ptr) ;
         }
@@ -410,6 +443,7 @@ public class Connect {
 	throws LibvirtException {
         Network returnValue = null ;
         Pointer ptr = libvirt.virNetworkCreateXML(VCP, xmlDesc) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Network(this, ptr) ;
         }
@@ -430,6 +464,7 @@ public class Connect {
 	throws LibvirtException {
         Network returnValue = null ;
         Pointer ptr = libvirt.virNetworkDefineXML(VCP, xmlDesc) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Network(this, ptr) ;
         }
@@ -447,6 +482,7 @@ public class Connect {
 	public Domain domainLookupByID(int id) throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainLookupByID(VCP, id) ;
+        processError() ;        
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -464,6 +500,7 @@ public class Connect {
 	public Domain domainLookupByName(String name) throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainLookupByName(VCP, name) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -486,6 +523,7 @@ public class Connect {
         }
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainLookupByUUID(VCP, uuidString.toString()) ;
+        processError() ;        
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -503,6 +541,7 @@ public class Connect {
 	throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainLookupByUUIDString(VCP, UUID) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -525,6 +564,7 @@ public class Connect {
 	throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainCreateLinux(VCP, xmlDesc, flags) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -543,6 +583,7 @@ public class Connect {
 	public Domain domainDefineXML(String xmlDesc) throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainDefineXML(VCP, xmlDesc) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -561,6 +602,7 @@ public class Connect {
     public Domain domainCreateXML(String xmlDesc, int flags) throws LibvirtException {
         Domain returnValue = null ;
         Pointer ptr = libvirt.virDomainCreateXML(VCP, xmlDesc, flags) ;
+        processError() ;                
         if (ptr != null) {
             returnValue = new Domain(this, ptr) ;
         }
@@ -591,6 +633,7 @@ public class Connect {
 	public NodeInfo nodeInfo() throws LibvirtException {
 	    virNodeInfo vInfo = new virNodeInfo();
 	    libvirt.virNodeGetInfo(VCP,vInfo) ;
+        processError() ;        	    
 	    return new NodeInfo(vInfo) ;
 	}
 
@@ -773,17 +816,8 @@ public class Connect {
 
 //	private native long _virStorageVolLookupByPath(long VCP, String path);
 
-//    @Override
-//    public void handleError(Pointer userData, virError error) throws LibvirtException {
-//        System.out.println("Hello") ;        
-//        this.processError(error) ;
-//    }
-//
-//    protected void processError(virError vError) throws LibvirtException {
-//        System.out.println("Hello") ;
-//        if (vError != null) {
-//            Error error = new Error(vError) ;
-//            throw new LibvirtException(error) ;
-//        }
-//    }
+
+    protected void processError() throws LibvirtException {
+        ErrorHandler.processError(libvirt, VCP) ;
+    }
 }
diff --git a/src/org/libvirt/Error.java b/src/org/libvirt/Error.java
index ada7be8..3ba8644 100644
--- a/src/org/libvirt/Error.java
+++ b/src/org/libvirt/Error.java
@@ -4,6 +4,8 @@ import java.io.Serializable;
 
 import org.libvirt.jna.virError;
 
+import com.sun.jna.Pointer;
+
 public class Error implements Serializable {
 
 	public static enum ErrorDomain {
@@ -302,14 +304,14 @@ public class Error implements Serializable {
 	ErrorDomain domain;
 	String message;
 	ErrorLevel level;
-	long VCP; /* Deprecated */
-	long VDP; /* Deprecated */
+	Pointer VCP; /* Deprecated */
+	Pointer VDP; /* Deprecated */
 	String str1;
 	String str2;
 	String str3;
 	int int1;
 	int int2;
-	long VNP; /* Deprecated */
+	Pointer VNP; /* Deprecated */
 	
     public Error() {
         
diff --git a/src/org/libvirt/ErrorHandler.java b/src/org/libvirt/ErrorHandler.java
index dca47a5..0e322ba 100644
--- a/src/org/libvirt/ErrorHandler.java
+++ b/src/org/libvirt/ErrorHandler.java
@@ -5,16 +5,20 @@ import org.libvirt.jna.virError;
 
 import com.sun.jna.Pointer;
 
-public class ErrorHandler implements Libvirt.virErrorFunc
+public class ErrorHandler
 {
-    public static ErrorHandler INSTANCE = new ErrorHandler() ;
 
-    @Override
-    public void handleError(Pointer userData, virError vError) throws LibvirtException
+    public static void processError(Libvirt libvirt) throws LibvirtException {
+        
+    }
+    public static void processError(Libvirt libvirt, Pointer conn) throws LibvirtException
     {
-        System.out.println("Hello") ;
-        if (vError != null) {
+
+        virError vError = new virError() ;
+        int errorCode = libvirt.virConnCopyLastError(conn, vError) ;
+        if (errorCode > 0) {        
             Error error = new Error(vError) ;
+            libvirt.virConnResetLastError(conn) ;
             throw new LibvirtException(error) ;
         }
         
diff --git a/src/org/libvirt/Network.java b/src/org/libvirt/Network.java
index 063345c..ce80f6f 100644
--- a/src/org/libvirt/Network.java
+++ b/src/org/libvirt/Network.java
@@ -49,7 +49,9 @@ public class Network {
 	 * @throws LibvirtException
 	 */
 	public String getXMLDesc(int flags) throws LibvirtException{
-	    return libvirt.virNetworkGetXMLDesc(VNP, flags) ; 
+	    String returnValue = libvirt.virNetworkGetXMLDesc(VNP, flags) ;
+	    processError() ;
+	    return returnValue  ;
 	}
 
 
@@ -62,6 +64,7 @@ public class Network {
 	public boolean getAutostart() throws LibvirtException{
 	    IntByReference autoStart = new IntByReference() ;
 	    libvirt.virNetworkGetAutostart(VNP, autoStart) ;
+        processError() ;	    
 	    return autoStart.getValue() != 0 ? true : false ;
 	}
 
@@ -76,6 +79,7 @@ public class Network {
 	public void setAutostart(boolean autostart) throws LibvirtException{
 	    int autoValue = autostart ? 1 : 0 ;
         libvirt.virNetworkSetAutostart(VNP, autoValue) ;	
+        processError() ;        
 	}
 
 
@@ -86,7 +90,9 @@ public class Network {
 	 * @throws LibvirtException
 	 */
 	public String getBridgeName() throws LibvirtException{
-	    return libvirt.virNetworkGetBridgeName(VNP) ;	
+	    String returnValue = libvirt.virNetworkGetBridgeName(VNP) ;
+        processError() ;
+        return returnValue ;
 	}
 	
 
@@ -108,7 +114,9 @@ public class Network {
 	 * @throws LibvirtException
 	 */
 	public String getName() throws LibvirtException{
-		return libvirt.virNetworkGetName(VNP);   
+		String returnValue = libvirt.virNetworkGetName(VNP);
+        processError() ;
+        return returnValue ;
 	}
 
 
@@ -122,6 +130,7 @@ public class Network {
 	public int[] getUUID() throws LibvirtException{
 	    byte[] bytes = new byte[Libvirt.VIR_UUID_BUFLEN] ;
 	    int success = libvirt.virNetworkGetUUID(VNP, bytes) ;
+        processError() ;	    
 	    int[] returnValue = new int[0] ; 
 	    if (success == 0) {
 	        returnValue = new int[Libvirt.VIR_UUID_BUFLEN] ;
@@ -142,6 +151,7 @@ public class Network {
 	public String getUUIDString() throws LibvirtException{
         byte[] bytes = new byte[Libvirt.VIR_UUID_STRING_BUFLEN] ;
         int success = libvirt.virNetworkGetUUIDString(VNP, bytes) ;
+        processError() ;        
         String returnValue = null ; 
         if (success == 0) {
             returnValue = new String(bytes) ;
@@ -158,6 +168,7 @@ public class Network {
 	 */
 	public void create() throws LibvirtException{
 	    libvirt.virNetworkCreate(VNP) ;
+        processError() ;	    
 	}
 
 
@@ -171,6 +182,7 @@ public class Network {
 	 */
 	public void destroy() throws LibvirtException{
         libvirt.virNetworkDestroy(VNP) ;
+        processError() ;        
 	}
 
 
@@ -183,6 +195,7 @@ public class Network {
 	 */
 	public void free() throws LibvirtException{
 		libvirt.virNetworkFree(VNP) ;
+	    processError() ;
 		VNP=null;
 	}
 
@@ -194,7 +207,12 @@ public class Network {
 	 */
 	public void undefine() throws LibvirtException{
         libvirt.virNetworkUndefine(VNP) ;
+        processError() ;        
 	}
+	
+    protected void processError() throws LibvirtException {
+        virConnect.processError() ;
+    }	
 
 
 }
diff --git a/src/org/libvirt/jna/Libvirt.java b/src/org/libvirt/jna/Libvirt.java
index 30ab49d..8727447 100644
--- a/src/org/libvirt/jna/Libvirt.java
+++ b/src/org/libvirt/jna/Libvirt.java
@@ -18,19 +18,15 @@ public interface Libvirt extends Library
     public static int VIR_UUID_BUFLEN = 16 ;
     public static int VIR_UUID_STRING_BUFLEN = (36+1) ;    
     
-    //Callbacks 
-    interface virErrorFunc extends Callback {
-        void handleError(Pointer userData, virError error) throws Exception ;
-    }    
-    
     // Global functions
+    public int virCopyLastError(virError error) ;
     public virError virGetLastError() ;    
     public int virGetVersion(LongByReference libVer, String type, LongByReference typeVer) ;
     public int virInitialize() ;    
-    public void virSetErrorFunc(long userData, virErrorFunc handler) ;
+    public void virResetLastError() ;
     
     //Connection Functions
-    public int virConnCopyLastError(Pointer virConnectPtr) ;        
+    public int virConnCopyLastError(Pointer virConnectPtr, virError to) ;        
     public int virConnectClose(Pointer virConnectPtr) ;    
     public String virConnectGetCapabilities(Pointer virConnectPtr) ;
     public String virConnectGetHostname(Pointer virConnectPtr) ;    
@@ -47,9 +43,9 @@ public interface Libvirt extends Library
     public int virConnectNumOfDefinedDomains(Pointer virConnectPtr) ;    
     public int virConnectNumOfDefinedNetworks(Pointer virConnectPtr) ;
     public int virConnectNumOfNetworks(Pointer virConnectPtr) ;    
+    public int virConnResetLastError(Pointer virConnectPtr) ;    
     public Pointer virConnectOpen(String name) ;
     public Pointer virConnectOpenReadOnly(String name) ;
-    public void virConnSetErrorFunc(Pointer virConnectPtr, long userData, virErrorFunc handler) ;
     
     // Node functions
     public int virNodeGetInfo(Pointer virConnectPtr, virNodeInfo virNodeInfo) ;
diff --git a/src/org/libvirt/jna/virError.java b/src/org/libvirt/jna/virError.java
index db462fa..10529fe 100644
--- a/src/org/libvirt/jna/virError.java
+++ b/src/org/libvirt/jna/virError.java
@@ -1,5 +1,6 @@
 package org.libvirt.jna;
 
+import com.sun.jna.Pointer;
 import com.sun.jna.Structure ;
 
 public class virError extends Structure
@@ -8,12 +9,12 @@ public class virError extends Structure
     public int domain ;
     public String message ;
     public int level ;
-    public long conn ;
-    public long dom ;
+    public Pointer conn ;
+    public Pointer dom ;
     public String str1 ;
     public String str2 ;
     public String str3 ;   
     public int int1 ;
     public int int2 ;    
-    public long net  ;    
+    public Pointer net  ;    
 }
diff --git a/src/test.java b/src/test.java
index 34d3518..a7d7ec8 100644
--- a/src/test.java
+++ b/src/test.java
@@ -142,7 +142,7 @@ public class test {
 		    testNetwork = conn.networkLookupByName("deftest") ;
 		    System.out.println("networkLookupByName: " + testNetwork.getName()) ;
             System.out.println(FIXME) ;
-            testNetwork=conn.networkLookupByUUID(UUID);
+//            testNetwork=conn.networkLookupByUUID(UUID);
 //            System.out.println("networkLookupByUUID: " + testNetwork.getName()) ;     
             testNetwork = conn.networkLookupByUUIDString("004b96e1-2d78-c30f-5aa5-f03c87d21e67");
             System.out.println("networkLookupByUUIDString: " + testNetwork.getName()) ;            
@@ -166,10 +166,10 @@ public class test {
 			System.out.println("exception caught:"+e);
 			System.out.println(e.getError());
 		}
-		//This should raise an excpetion
-        System.out.println(FIXME) ;     		
+		//This should raise an excpetion   		
 		try{
-			System.out.println("virNetworkCreate:");  testNetwork.create();
+			System.out.println("virNetworkCreate (should error):");  
+			testNetwork.create();
 		} catch (LibvirtException e){
 			System.out.println("exception caught:"+e);
 			System.out.println(e.getError());
-- 
1.6.0.6




More information about the libvir-list mailing list