Okay, so it sounds like we are all pretty much agreed on doing a dynamic proxy wrapper for the pojos. This is probably simple enough that we didn't need a formal proposal, but I collected the relevant bits and put them on the wiki.
http://www.rollerweblogger.org/wiki/Wiki.jsp?page=PojoWrapper how about a final vote to make sure? Also, unless someone else wants to tackle this reasonably soon then I'll go ahead and commit to it. I think this is a pretty important item and i'd like to have it included in our next release for blogs.sun.com. -- Allen On Sun, 2005-07-10 at 08:27, Anil Gangolli wrote: > An additional suggestion: the "restriction interfaces" (see below) could be > constructed using XDoclet, so that we could just tag the > bean methods to be exposed. One has to write a suitable XDoclet template for > it, though. > > --a. > > > > ----- Original Message ----- > From: "Dave Johnson" <[EMAIL PROTECTED]> > To: <[email protected]> > Sent: Friday, July 08, 2005 3:40 PM > Subject: Re: velocity context cleanup > > > > > > +1 on dynamic proxies! > > > > - Dave > > > > > > On Jul 6, 2005, at 11:17 AM, Anil Gangolli wrote: > > > >> > >> Yes, I meant using the dynamic proxy facilities introduced in Java 1.3 > >> (see, e.g. > >> http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html). > >> > >> I apologize for the terseness. Here's a more complete description. > >> > >> Note that the success of this approach willl hinge on the reflection of > >> the proxy class seen by Velocity as being the restricted > >> interface desired to be exposed. Reading "Proxy Class Properties" in the > >> above document, this should be the case. > >> > >> (1) Define a simple invocation handler class whose invoke() method just > >> does an m.invoke(obj) on the passed in params, > >> and just unwraps InvocationTargetException to throw back any > >> originating Throwable it contains. > >> See the examples in the doc above. > >> > >> (2) Define your restriction interfaces whose names can be derived by > >> convention from the name of the associated POJO > >> (like org.roller.pojos.Template -> > >> org.roller.presentation.velocity.wrappers.Template or TemplateWrapper). > >> You must > >> define an interface to use a dynamic proxy. > >> > >> (3) Define a single proxy factory method wrap() that generates a proxy. > >> [With the following example code it would be > >> VelocityWrapper.wrap(thePojo)]. You just call this and place the result > >> into the Velocity context. > >> > >> Here is APPROXIMATE pseudo-code for illustration. Note: this won't > >> compile for sure without a createWrapperFromPojoName() method > >> defined. You can get the intent anyway. > >> > >> public class VelocityWrapper { > >> > >> public static Object wrap(Object pojo) { > >> // Determine the wrapper interface class name from the pojo > >> class name > >> String restrictionInterfaceName = > >> createWrapperNameFromPojoName(pojo.getClass().getName()); > >> // Get that class an return a proxy instance with the > >> invocation handler below. > >> Class restrictionInterface = > >> pojo.getClass().getClassLoader().loadClass(restrictionInterfaceName); > >> SimpleInvocationHandler handler = new > >> SimpleInvocationHandler(pojo); > >> return Proxy.newProxyInstance(pojo.getClass().getClassLoader, > >> new Class[] { > >> restrictionInterface }, > >> handler); > >> } > >> > >> public static class SimpleInvocationHandler implements > >> InvocationHandler { > >> private Object theWrappedPojo; > >> > >> SimpleInvocationHandler(Object pojo) { > >> // When constructed, remember the instance we were > >> constructed with > >> theWrappedPojo = pojo; > >> } > >> > >> public Object invoke(Object proxy, method m, Object[] args) > >> throws Throwable { > >> try { > >> return m.invoke(theWrappedPojo, args); > >> } catch (InvocationTargetException e) { > >> // rethrow the original exception to make the > >> wrapping transparent > >> throw e.getTargetException(); > >> } > >> } > >> } > >> } > >> > >> > >> > >> > >> > >> ----- Original Message ----- From: "Rudman Max" <[EMAIL PROTECTED]> > >> To: <[email protected]> > >> Sent: Tuesday, July 05, 2005 10:07 PM > >> Subject: Re: velocity context cleanup > >> > >> > >>> I think he is talking about dynamic proxy facilities provided by > >>> java.lang.reflect.Proxy. Instead of creating a wrapper class > >>> for each POJO you could deposit a dynamically proxy class in the Velocity > >>> context constructed with InvocationHandler > >>> implementation which blocks all method calls unless they begin with > >>> "set/is". I personally think this a really good idea. > >>> > >>> Max > >>> > >>> On Jul 6, 2005, at 12:50 AM, Allen Gilliland wrote: > >>> > >>>> I'm not sure what you mean by dynamic proxy. Could you give more info. > >>>> > >>>> -- Allen > >>>> > >>>> > >>>> Anil Gangolli wrote: > >>>> > >>>> > >>>>> > >>>>> Just a quick note, and I admit I haven't followed the latest > >>>>> discussion, but if the wrappers are merely restrictions by a > >>>>> specified interface, it seems like a single dynamic proxy could > >>>>> implement all of them. > >>>>> > >>>>> --a. > >>>>> > >>>>> ----- Original Message ----- From: "Allen Gilliland" <[EMAIL > >>>>> PROTECTED]> > >>>>> To: <[email protected]> > >>>>> Sent: Tuesday, July 05, 2005 3:31 PM > >>>>> Subject: Re: velocity context cleanup > >>>>> > >>>>> > >>>>> > >>>>>> agreed. so the convention will be ... > >>>>>> org.roller.presentation.velocity.wrappers.<POJO Class>Wrapper > >>>>>> > >>>>>> will act as a wrapper class for a <POJO Class> normally found in > >>>>>> org.roller.pojos > >>>>>> > >>>>>> -- Allen > >>>>>> > >>>>>> > >>>>>> Lance Lavandowska wrote: > >>>>>> > >>>>>> > >>>>>>> Ooops, you caught me not paying sufficient attention, even whilst I > >>>>>>> was typing out the package name! Hmm, I think I like > >>>>>>> o.r.p.v.wrappers > >>>>>>> better, less confusion with the "real" "pojos". > >>>>>>> > >>>>>>> On 7/5/05, Allen Gilliland <[EMAIL PROTECTED]> wrote: > >>>>>>> > >>>>>>> > >>>>>>>> i can do that, but org.roller.presentation.velocity.pojos *is* a new > >>>>>>>> sub-package. maybe org.roller.presentation.velocity.wrappers would > >>>>>>>> be > >>>>>>>> more clear? > >>>>>>>> > >>>>>>>> -- Allen > >>>>>>>> > >>>>>>>> > >>>>>>>> Lance Lavandowska wrote: > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>>> Just one suggestion, put the wrappers in a sub-package, perhaps > >>>>>>>>> org.roller.presentation.velocity.pojos.wrappers ? > >>>>>>>>> > >>>>>>>>> > >>>>>> > >>>>>> > >>>>> > >> > > >
