[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Is @DeclareMixin + around advice supported?
|
Hi,
> I would like to know whether it is supported to use @DeclareMixin & around
> advice in the way like below:
Yep, it should be supported. Although I wouldn't imagine we have any
regression testcases for that combination of features.
My suspicion is around the proceed() method handling, I know it isn't
perfect for annotation style so you are likely tripping over it and
not being able to work out what it wants to be passed. Have you tried
a code style aspect to see if that works just fine? (this would
confirm that it is the annotation style proceed() method that is at
fault).
Raise a bugzilla for it.
cheers,
Andy
On 14 January 2012 16:52, Arata Yamamoto <artymt@xxxxxxxxx> wrote:
> Hello,
>
> public interface KeySetKeyLockHandler {
> // method signatures
> }
>
> public static class KeySetKeyLockHandlerImpl implements
> KeySetKeyLockHandler {
> // contents of class
> }
>
> @DeclareMixin(
> value="slingong.web.gae.TransactionalMemcacheServiceImpl")
> public static KeySetKeyLockHandler addKeySetKeyLockHandlerInterface(
> Object instance) {
> return new KeySetKeyLockHandlerImpl(
> (TransactionalMemcacheServiceImpl)instance);
> }
>
> @Around( value="execution( "
> + "public *
> slingong.web.gae.TransactionalMemcacheServiceBase+"
> + ".setKeySetKey( java.lang.String)) "
> + "&& this( keySetKeyLockHandler)"
> )
> public Object aroundAdvisedSetKeySetKeyMethodExecution(
> ProceedingJoinPoint proceedingJoinPoint, KeySetKeyLockHandler
> keySetKeyLockHandler) {
>
> // Do some works on keySetKeyLockHandler
>
> // Invocation of actual target method
> -------------------------------------------------
> try {
> return proceedingJoinPoint.proceed(
> proceedingJoinPoint.getArgs());
> }
> catch( Throwable throwable) {
> // Exception handling
> }
> //
> ------------------------------------------------------------------------------------
>
> // Do some works on keySetKeyLockHandler
> }
>
> Note:
> KeySetKeyLockHandler interface does not contain the definition of
> the setKeySetKey method.
> TransactionalMemcacheServiceImpl class is extended from
> TransactionalMemcacheServiceBase abstract class
>
> I abbreviated the details from the actual code for easier readability.
>
> What I expected was that, of course, calling the proceed method in the code
> snippet above executes setKeySetKey method of
> TransactionalMemcacheServiceImpl instance.
> However, it fails at that statement by the puzzling ClassCastException like:
> slingong.web.gae.TransactionalMemcacheServiceException:
> java.lang.ClassCastException: java.lang.String cannot be cast to
> slingong.web.gae.TransactionalMemcacheServiceBase
> at
> slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody1$advice(TransactionalMemcacheServiceBase.java:456)
> at
> slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody2(TransactionalMemcacheServiceBase.java:1)
> at
> slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody3$advice(TransactionalMemcacheServiceBase.java:578)
> at
> slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey(TransactionalMemcacheServiceBase.java:132)
> at
> slingong.web.gae.TransactionalMemcacheServiceFactory.getInstance(TransactionalMemcacheServiceFactory.java:180)
> at
> slingong.web.gae.TransactionalMemcacheServiceFactoryTest.testGetInstance(TransactionalMemcacheServiceFactoryTest.java:93)
>
> As you may notice from the stack trace above, I have 2 around-advices
> weaving at this join point, and as I said that I omitted the detail, that
> exception may not be caused of the usage of @DeclareMixin & around advice
> but from those omitted parts. However, I like to be sure about if it's
> supported usage before digging deeper to find the cause, since I do not feel
> so sure about calling ProceedingJoinPoint.proceed method after mixing even
> though I assumed that it would be OK because I could not have found any
> document to tell the restriction on such combination.
>
> I ran the test code under debugger and found that it fails at the statement
> calling proceed method right after getArgs method returns before actually
> running target setKeySetKey method.
> Just before throwing the exception, proceedingJoinPoint appeared as below in
> debugger (though I eliminated the info
> on TransactionalMemcacheServiceImpl fields because I thought those would
> just bloated lines of info without clue.) It appears to me that
> the proceedingJoinPoint seems to be expected...
>
> proceedingJoinPoint JoinPointImpl (id=49)
> _this TransactionalMemcacheServiceImpl (id=44)
>
> $SWITCH_TABLE$com$google$appengine$api$memcache$MemcacheService$SetPolicy
> null
> ajc$anno$0 null
>
> ajc$aspectjutil_eventmanager_EventListenerInstanceTracker$ptwAspectInstance
> EventListenerInstanceTracker (id=55)
> ajc$withinType
> "slingong.web.gae.TransactionalMemcacheServiceBase" (id=106)
> listenerMap WeakHashMap<K,V> (id=107)
>
> ajc$aspectjutil_eventmanager_EventListenerInstanceTracker$ptwAspectInstance
> EventListenerInstanceTracker (id=72)
> ajc$withinType
> "slingong.web.gae.TransactionalMemcacheServiceImpl" (id=111)
> listenerMap WeakHashMap<K,V> (id=112)
>
> ajc$instance$slingong_web_gae_TransactionalMemcacheServiceBaseThreadSyncAspect$slingong_web_gae_TransactionalMemcacheServiceBaseThreadSyncAspect$KeySetKeyLockHandler
> TransactionalMemcacheServiceBaseThreadSyncAspect$KeySetKeyLockHandlerImpl
> (id=73)
> transactionalMemcacheServiceImpl
> TransactionalMemcacheServiceImpl (id=44)
> arc null
> args Object[1] (id=101)
> [0] "testGetInstance_keySetKey" (id=67)
> staticPart JoinPointImpl$StaticPartImpl (id=103)
> id 1
> kind "method-execution" (id=115)
> count 16
> hash 0
> offset 0
> value (id=128)
> signature MethodSignatureImpl (id=116)
> EMPTY_CLASS_ARRAY Class<T>[0] (id=129)
> EMPTY_STRING_ARRAY String[0] (id=131)
> useCache true
> declaringType Class<T>
> (slingong.web.gae.TransactionalMemcacheServiceBase) (id=43)
> declaringTypeName
> "slingong.web.gae.TransactionalMemcacheServiceBase" (id=106)
> exceptionTypes Class<T>[0] (id=137)
> lookupClassLoader null
> method null
> modifiers 1
> name "setKeySetKey" (id=138)
> parameterNames String[1] (id=139)
> [0] "newKeysSetKey" (id=141)
> parameterTypes Class<T>[1] (id=140)
> [0] Class<T> (java.lang.String) (id=68)
> returnType Class<T> (void) (id=142)
> stringCache SignatureImpl$CacheImpl (id=143)
> toStringCacheRef SoftReference<T> (id=149)
> clock 1326542103609
> lock Reference$Lock (id=152)
> pending null
> discovered null
> next null
> queue ReferenceQueue$Null (id=154)
> referent String[3] (id=157)
> [0] "void
> slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey(String)"
> (id=161)
> [1] null
> [2] null
> timestamp 1326542103609
> stringRep null
> sourceLocation SourceLocationImpl (id=118)
> fileName "TransactionalMemcacheServiceBase.java"
> (id=162)
> line 130
> withinType Class<T>
> (slingong.web.gae.TransactionalMemcacheServiceBase) (id=43)
> target TransactionalMemcacheServiceImpl (id=44)
>
> Regards,
> Art
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>