You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Christoph Gaffga <cg...@triplemind.com> on 2003/08/29 02:17:23 UTC

[PATCH] [betwixt] Use interface dot-betwixt-file, if class is proxy

hi,

> > I've implemented a way to customize the serialization of EJBs through
> > dot-betwixt-files.
> > My solution looks up the dot-betwixt-file if the class to serialize is a
> > Proxy. I only changed some lines in XMLIntrospector.findByXMLDescriptor.

and here is the patch for it. I hope it finds it way into the betrixt
codebase.
I found it very usefull as it doesn't realy make sense to serialize the
proxy class (perheaps it makes sense to serialize the remote handle in some
cases).

> > - How/Where can I change behavior to use the interface-Description
instead
> > of the classes one if no dot-betwixt-file ist found?

this issue I haven't solved yet.

> 3. please don't lose enthusiasm if it takes a while for the patch to get
> committed.

Sure, but please let me know, if you reject it, and why. Or in favor of
witch solution.

> but i'm trying to be careful about the design and get it right (this
time).

Yeah, and you did a great job. I realy like, what betwix does.

regards
Christoph (cgaffga@triplemind.com)

cvs diff -u XMLIntrospector.java
Index: XMLIntrospector.java
===================================================================
RCS file:
/home/cvspublic/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/
XMLIntrospector.java,v
retrieving revision 1.23
diff -u -w -b -B -r1.23 XMLIntrospector.java
--- XMLIntrospector.java 27 Jul 2003 18:47:39 -0000 1.23
+++ XMLIntrospector.java 28 Aug 2003 23:54:45 -0000
@@ -61,6 +61,7 @@
 import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
+import java.lang.reflect.Proxy;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -735,21 +736,29 @@
      * Attempt to lookup the XML descriptor for the given class using the
      * classname + ".betwixt" using the same ClassLoader used to load the
class
      * or return null if it could not be loaded
+     * If <code>aClass</code> is a Proxy use the first interface instead.
      *
      * @param aClass digester .betwixt file for this class
      * @return XMLBeanInfo digested from the .betwixt file if one can be
found.
      *         Otherwise null.
      */
     protected synchronized XMLBeanInfo findByXMLDescriptor( Class aClass )
{
+        Class showClass = aClass;
+
+        // If the class is a Proxy, use the interface
+        if ( Proxy.isProxyClass(aClass) && aClass.getInterfaces().length >
0 ) {
+            showClass = aClass.getInterfaces()[0];
+        }
+
         // trim the package name
-        String name = aClass.getName();
+        String name = showClass.getName();
         int idx = name.lastIndexOf( '.' );
         if ( idx >= 0 ) {
             name = name.substring( idx + 1 );
         }
         name += ".betwixt";

-        URL url = aClass.getResource( name );
+        URL url = showClass.getResource( name );
         if ( url != null ) {
             try {
                 String urlText = url.toString();