Hello,

I would like to know whether it is supported to use @DeclareMixin & around
advice in the way like below:
     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
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to