On Thu, 20 May 2010 18:09:05 -0300, Igor Drobiazko
<[email protected]> wrote:
As Thiago already mentioned annotations & proxies are very annoying right
now. Maybe I'll have a look at this too.
I've took a look and, given the free time I had at the moment, I couldn't
find a complete solution for it ClassFab gets in the way. On the other
hand, I've found some code that copies annotations in Javassist. I pasted
it in the end of this message.
Thinking about proxies, I wondered if on-the-fly source code generation
and compilation wouldn't be a solution. Java 6 provides a well-defined
compiler API, 5 doesn't, but we could work around this. I've been using
the FreeMarker template engine to generate source code with success.
Also integration with CDI is a must have for marketing stuff. It would be
nice to make Tapestry CDI compliant with "standards".
We could create a module that provides Tapestry-IoC as a CDI portable
extension. The documentation is here:
http://docs.jboss.org/weld/reference/1.0.1-Final/en-US/html/extend.html.
This feature, when the annotation in service methods issue is fixed, will
allow us to use T-IoC like distributed configuration and use EJB features,
like transaction management, at the same time. Best of two worlds. :)
From
http://repo.aduna-software.org/websvn/filedetails.php?repname=aduna&path=%2Forg.openrdf%2Falibaba%2Ftrunk%2Fobject-repository%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenrdf%2Frepository%2Fobject%2Fcomposition%2FClassTemplate.java&rev=9054&sc=1:
private void copyAnnotations(Method method, MethodInfo info)
throws NotFoundException {
copyMethodAnnotations(method, info);
copyParameterAnnotations(method, info);
}
private void copyMethodAnnotations(Method method, MethodInfo info)
throws NotFoundException {
String name = method.getName();
CtClass[] parameters = asCtClassArray(method.getParameterTypes());
for (CtMethod e : get(method.getDeclaringClass()).getMethods()) {
if (!equals(e, name, parameters))
continue;
MethodInfo em = e.getMethodInfo();
AnnotationsAttribute ai = (AnnotationsAttribute) em
.getAttribute(AnnotationsAttribute.visibleTag);
if (ai == null)
continue;
if (ai.getAnnotations().length > 0) {
info.addAttribute(ai.copy(info.getConstPool(),
Collections.EMPTY_MAP));
break;
}
}
}
private void copyParameterAnnotations(Method method, MethodInfo info)
throws NotFoundException {
String name = method.getName();
CtClass[] parameters = asCtClassArray(method.getParameterTypes());
for (CtMethod e : get(method.getDeclaringClass()).getMethods()) {
if (!equals(e, name, parameters))
continue;
MethodInfo em = e.getMethodInfo();
ParameterAnnotationsAttribute ai =
(ParameterAnnotationsAttribute) em
.getAttribute(ParameterAnnotationsAttribute.visibleTag);
if (ai == null)
continue;
Annotation[][] anns = ai.getAnnotations();
for (int i = 0, n = anns.length; i < n; i++) {
if (anns[i].length > 0) {
info.addAttribute(ai.copy(info.getConstPool(),
Collections.EMPTY_MAP));
return;
}
}
}
}
--
Thiago H. de Paula Figueiredo
Independent Java, Apache Tapestry 5 and Hibernate consultant, developer,
and instructor
Owner, Ars Machina Tecnologia da Informação Ltda.
http://www.arsmachina.com.br
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]