Re: CGLib help

From: Bill Dudney (bdudne..pache.org)
Date: Mon May 22 2006 - 13:56:08 EDT

  • Next message: Mike Kienenberger: "Error restoring child DataContext from serialization?"

    Sorry I'm so late getting back to you,

    J1 swamped me :-)

    I can try it out late in the week.

    I'll keep the list informed of how it goes.

    TTFN,

    Bill Dudney
    MyFaces - http://myfaces.apache.org
    Cayenne - http://incubator.apache.org/projects/cayenne.html

    On May 18, 2006, at 4:28 PM, Andrus Adamchik wrote:

    > Bill,
    >
    > I had an idea of how we can go about it, although I got a little
    > backed up to try it now. Do you have time to play with it?
    >
    > IIRC ASM bytecode reader uses callback mechanism to notify the
    > writer when a certain piece of code (such as method) is parsed. In
    > a non-transforming case the writer simply outputs everything the
    > reader gives it. So how about this - when a callback is invoked for
    > a method that we want to intercept, our transformer writes it into
    > a method with a different name, at the same time generating a
    > method with the original name that invokes the interceptor code and
    > the newly created method. This way we can treat the method body as
    > a black box, and still wrap it with custom code:
    >
    > Original:
    >
    > public void setX(Object x) {
    > ... some code ...
    > }
    >
    >
    > Transformer output:
    >
    > public void setX(Object x) {
    > beforeSetX();
    > ___setX(x);
    > afterSetX();
    > }
    >
    > private void ____setX(Object x) {
    > ... some code ...
    > }
    >
    >
    > Andrus
    >
    >
    > On May 17, 2006, at 10:43 AM, Andrus Adamchik wrote:
    >
    >> Hi Bill,
    >>
    >> I will be working on the B3 release today. Once this is done, I'll
    >> take a look at how we can do it with ASM.
    >>
    >> Andrus
    >>
    >>
    >> On May 16, 2006, at 11:40 PM, Bill Dudney wrote:
    >>
    >>> Hey Andrus,
    >>>
    >>> I spent the bulk of my time investigating ASM route and I don't
    >>> see a straightforward way to do the injection. Creating new
    >>> methods is straightforward but injecting method calls around the
    >>> original method is not so straightforward.
    >>>
    >>> Any ideas how that might work?
    >>>
    >>> Thanks,
    >>>
    >>> -bd-
    >>>
    >>> On May 16, 2006, at 10:22 AM, Andrus Adamchik wrote:
    >>>
    >>>> Bill,
    >>>>
    >>>> This confirms my suspicion that CGlib was not designed for such
    >>>> use. Probably we may need to try using ASM directly. But of
    >>>> course if anyone can get in touch with CGlib folks, it would be
    >>>> nice to doublecheck with them.
    >>>>
    >>>> Andrus
    >>>>
    >>>>
    >>>> On May 16, 2006, at 1:50 AM, Bill Dudney wrote:
    >>>>
    >>>>> Hi Andrus,
    >>>>>
    >>>>> Sorry I'm still not done.
    >>>>>
    >>>>> I've been searching and hacking for way to long now to try to
    >>>>> get this code in. The basic problem is that like you I could
    >>>>> not find a way to wrap the original implementation of the
    >>>>> method using the CGLib implementation path that exists in the
    >>>>> rest of the code. It appears to be easy with the Enhancer API.
    >>>>>
    >>>>> I prefer your approach to the Enhancer but I'm at a loss as to
    >>>>> how to make it work. I'll try to get some more time tomorrow to
    >>>>> look at it but I'm going to be very busy doing J1 stuff.
    >>>>>
    >>>>> Does anyone know if the CGLib folks are on IRC anywhere?
    >>>>>
    >>>>> TTFN,
    >>>>>
    >>>>> -bd-
    >>>>>
    >>>>> On May 4, 2006, at 7:15 PM, Andrus Adamchik wrote:
    >>>>>
    >>>>>> I need some help with CGLib. It is great for proxies, but our
    >>>>>> enhancer changes the actual class instead of making a proxied
    >>>>>> subclass. Such scenario is a pain... Maybe Jeff or someone
    >>>>>> else has an idea how to implement the enhancing code below?
    >>>>>>
    >>>>>> Basically I am trying to inject code calling a static delegate
    >>>>>> method in three places:
    >>>>>>
    >>>>>> 1. Property getter start: DataObjectDelegate.beforeGetProperty
    >>>>>> 2. Property setter start: DataObjectDelegate.beforeSetProperty
    >>>>>> 3. Property setter end: DataObjectDelegate.afterSetProperty
    >>>>>>
    >>>>>> I was able to implement a simpler case of creating synthetic
    >>>>>> properties with getters and setters (InterfaceMethodInjector),
    >>>>>> but got stuck with this one (see TODO's on the
    >>>>>> DataObjectAccessorInjector). I suspect we'll have to use ASM
    >>>>>> for that, but if anyone can figure a CGlib solution, please
    >>>>>> let me know.
    >>>>>>
    >>>>>> Andrus
    >>>>>
    >>>>>
    >>>>
    >>>
    >>>
    >>
    >>
    >



    This archive was generated by hypermail 2.0.0 : Mon May 22 2006 - 13:56:32 EDT