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