Skip to main content

[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
>


Back to the top