+1
- Dave
On Jul 12, 2005, at 5:41 PM, Allen Gilliland wrote:
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 ?