Hi Andy,
thanks for your reply.
If I try the signature that you mention and do a maven install, I get errors
like the following:
error at public List<DocumentPM> getDocuments() {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
C:\Development\svn\trunk\std\presentation_layer\portal\portal_war\src\main\java\com\leanapps\portal\model\pension\plan\PensionPlanPM.java:3052:0::0
incompatible return type applying to method-execution(java.util.List
com.leanapps.portal.model.pension.plan.PensionPlanPM.getDocuments())
Which is repeated for every single time the aspect tries to do its job.
Kind regards,
Rens
From: [email protected]
[mailto:[email protected]] On Behalf Of Andy Clement
Sent: Tuesday, February 12, 2013 7:26 PM
To: [email protected]
Subject: Re: [aspectj-users] Generics in return types causing warnings
Hi,
I'm pretttty sure there are AspectJ bugs in this area that you are hitting
(around advice and generics). Feels like this kind of thing is what you wanted:
<T> List<T> makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint
joinPoint) { .. }
what compile errors do you get? Maybe raise a bugzilla for it.
cheers,
Andy
On 4 February 2013 03:27, Rens van Leeuwen <[email protected]>
wrote:
Hi everybody,
I've been trying to get a hierarchy of classes return defensive copies of
instances of the Java Collections Framework. The idea is, that a caller should
not be able to add/remove elements of a returned List<?> for instance, because
the entity that returned that list should be the one managing it.
I thought of using an aspect, and when trying to do so, I found out that it
works, but it produces quite a bunch of warnings in both my Eclipse workspace
as well as during weaving during a Maven build. I'm wondering if there's
anything I can do to get rid of those warnings.
I wrote the following class to define the aspect (stripped to only contain an
example method):
@Aspect
public final class DefensiveCopyCollectionsReturningAspect {
/**
* Every 'getter' method in the portal model hierarchy that returns a
* {@link List} should return a defensive copy so that calling clients
* don't change the internal structure of the portal model.
*
* @param joinPoint The joinpoint.
* @return An defensive copy of the returned list.
*/
@SuppressWarnings("unchecked", "rawtypes")
@Around("execution(public !static java.util.List<*> (AbstractPM+).get*())")
public List makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint
joinPoint) {
try {
return new ArrayList((List) joinPoint.proceed());
} catch (final Throwable exception) {
throw new PortalRuntimeException(exception);
}
}
}
I've defined methods that do similar things for Set and Map as well, which
works like a charm. However, since the return type of the method is
java.util.List, without any generics involved, I see the following warnings:
-- unchecked conversion when advice applied at shadow
method-execution(java.util.List
com.leanapps.portal.model.pension.participation.ParticipationPM.getDocuments()),
expected java.util.List<com.leanapps.portal.model.report.DocumentPM> but
advice uses java.util.List [Xlint:uncheckedAdviceConversion]
Now here's the million (OK, maybe a little less ;)) dollar question: Is there
any way to get the generics to work? I've tried several things, but they all
don't seem to work. I've tried
<T> List<T> makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint
joinPoint) { .. }
which results in compilation errors:
-- incompatible return type applying to method-execution(java.util.List
com.leanapps.portal.model.pension.participation.ParticipationPM.getDocuments())
If I try to add generics to the annotation:
@Around("execution(public !static java.util.List<T+> (AbstractPM+).get*())")
I see that no advice has been applied at all:
-- advice defined in
com.leanapps.portal.model.DefensiveCopyCollectionsReturningAspect has not been
applied
Hope that somebody on this list has an answer to this.
Kind regards,
Rens
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users