You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by robert burrell donkin <ro...@blueyonder.co.uk> on 2003/09/08 17:23:28 UTC
Re: [PATCH] [betwixt] Use interface dot-betwixt-file, if class is proxy
hi cristoph
i haven't applied your patch for a couple of reasons:
1. i'd prefer to solve the more general problem of being able to
introspect interfaces rather than implementations
2. proxy is 1.3 and so i'd prefer not to introduce a dependency on Proxy
(if it can be avoided).
hopefully the code i've committed will provide an alternative solution.
you'll need to do a little more work outside the betwixt code something
like:
XMLIntrospector introspector = ...
...
introspector.setClassNormalizer( new ClassNormalizer() {
public Class normalize( Class clazz ) {
if (Proxy.isProxyClass(clazz) && class.getInterfaces().length > 0 ) {
return clazz.getInterfaces()[0];
}
}
});
i've covered an alternative (if your container implementation doesn't use
Proxy's) in the online documentation.
hope this solves your problem.
- robert
On Friday, August 29, 2003, at 01:17 AM, Christoph Gaffga wrote:
> 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();
>
>
>
Re: [PATCH] [betwixt] Use interface dot-betwixt-file, if class is proxy
Posted by Christoph Gaffga <cg...@triplemind.com>.
> i haven't applied your patch for a couple of reasons:
> 1. i'd prefer to solve the more general problem of being able to
> introspect interfaces rather than implementations
Sounds good :)
> hopefully the code i've committed will provide an alternative solution.
> you'll need to do a little more work outside the betwixt code something
> like:
...
> hope this solves your problem.
Yes, it does. And it's a clean solution.
Thanks a lot!
regards
Christoph
>
> - robert
>
> On Friday, August 29, 2003, at 01:17 AM, Christoph Gaffga wrote:
>
> > 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();
> >
> >
> >