Re: using JDOM 1.1 on Android's Dalvik VM

Jason Hunter <[email protected]>
Newsgroups gmane.comp.java.jdom.general
Message-ID <[email protected]>
Here's a diff for the change I just committed.

http://markmail.org/message/gamwpsmeieovaroq

-jh-

Index: JDOMException.java
===================================================================
RCS file: /home/cvs/jdom/src/java/org/jdom/JDOMException.java,v
retrieving revision 1.24
diff -u -r1.24 JDOMException.java
--- JDOMException.java	10 Nov 2007 05:28:59 -0000	1.24
+++ JDOMException.java	10 Dec 2008 00:02:17 -0000
@@ -291,14 +291,16 @@
              return  
((ExceptionInInitializerError)parent).getException();
          }

-        if (parent instanceof RemoteException) {
-            return ((RemoteException)parent).detail;
+        // The RMI classes are not present in Android's Dalvik VM, so  
we use reflection to access them.
+
+        Throwable nestedException =  
getNestedExceptionFromField(parent, "java.rmi.RemoteException",  
"detail");
+        if (nestedException != null) {
+            return nestedException;
          }

-        // These classes are not part of standard JDK 1.1 or 1.2, so we
-        // use reflection to access them.
+        // These classes are not part of standard JDK 1.1 or 1.2, so  
again we use reflection to access them.

-        Throwable nestedException = getNestedException(parent,  
"javax.naming.NamingException", "getRootCause");
+        nestedException = getNestedException(parent,  
"javax.naming.NamingException", "getRootCause");
          if (nestedException != null) {
              return nestedException;
          }
@@ -336,4 +338,31 @@

          return null;
      }
+
+    // This method is similar to getNestedException() except it looks  
for a field instead
+    // of a method.
+    private static Throwable getNestedExceptionFromField(
+                                 Throwable parent, String className,  
String fieldName) {
+        try {
+            // See if this Throwable is of the desired type, by using  
isAssignableFrom().
+            Class testClass = Class.forName(className);
+            Class objectClass = parent.getClass();
+            if (testClass.isAssignableFrom(objectClass)) {
+                // Use reflection to call the specified method.
+                Class[] argClasses = new Class[0];
+                Field field = testClass.getField(fieldName);
+                return (Throwable)field.get(parent);
+            }
+        }
+        catch(Exception ex) {
+            // Most likely, the desired class is not available in  
this VM. That's fine.
+            // Could be that the named field isn't of type Throwable,  
but that should happen
+            // with proper call usage.
+            // Even if it's caused by something else, we don't want  
to display an error
+            // here, since we're already in the process of trying to  
display the original
+            // error - another error here will just confuse things.
+        }
+
+        return null;
+    }
  }

On Dec 3, 2008, at 9:48 AM, Jason Hunter wrote:

> Yes, I'll be doing it.
>
> -jh-
>
> On Dec 2, 2008, at 6:08 PM, Sean Sullivan wrote:
>
>>
>> ping
>>
>>
>> Is there anybody on the JDOM dev team who can commit this  
>> enhancement to the source tree?
>>
>> Sean
>>
>>
>> On Wed, Nov 26, 2008 at 2:55 PM, Sean Sullivan  
>> <[email protected]> wrote:
>> Thanks for the feedback.  Your suggestion sounds good to me.
>>
>> Is there anybody on the JDOM dev team who can commit this enhancement
>> to the source tree?
>>
>> This enhancement would allow Android developers to consume
>> XML web services using JDOM.
>>
>> Sean
>>
>> On Wed, Nov 26, 2008 at 1:27 PM, Laurent Bihanic
>> <[email protected]> wrote:
>> >
>> > > Is there a better way to code this?  Any other comments?
>> >
>> > Seems OK but you may wish to stick to the existing way of  
>> handling possibly not available exception classes in JDOMException  
>> by :
>> > - adding a new getNestedException() method e.g.  
>> getNestedExceptionFromField(Throwable, String, String)
>> > - using Class.forName() and isAssignableFrom as in :
>> >            Class testClass = Class.forName(className);
>> >            Class objectClass = parent.getClass();
>> >            if (testClass.isAssignableFrom(objectClass)) {
>> >               ...
>> >
>>
>> _______________________________________________
>> To control your jdom-interest membership:
>> http://www.jdom.org/mailman/options/jdom-interest/[email protected]
>
> _______________________________________________
> To control your jdom-interest membership:
> http://www.jdom.org/mailman/options/jdom-interest/ 
> [email protected]

_______________________________________________
To control your jdom-interest membership:
http://www.jdom.org/mailman/options/jdom-interest/[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.